Мне удалось написать систему комментариев на python, django.но чтобы сделать комментарий, пользователь должен перейти на другой URL.Я не хочу, чтобы пользователи переходили на другую страницу, чтобы писать, редактировать, удалять комментарии.Я погуглил, и мне кажется, что я должен использовать ajax, но я не уверен.кто-нибудь может подсказать мне, как это сделать?
views.py
@login_required
def comment_new(request, post_pk):
post = get_object_or_404(Post, pk=post_pk)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect('home')
else:
form = CommentForm()
return render(request, 'community/comment_form.html', {
'form':form,
})
@login_required
def comment_edit(request, post_pk, pk):
#post = get_object_or_404(Post, pk=post_pk)
comment = get_object_or_404(Comment, pk=pk)
if comment.author != request.user:
return redirect(comment.post)
if request.method == 'POST':
form = CommentForm(request.POST, instance=comment)
if form.is_valid():
comment = form.save()
return redirect(comment.post)
else:
form = CommentForm(instance=comment)
return render(request, 'community/comment_form.html', {
'form':form,
})
@login_required
def comment_delete(request, post_pk, pk):
comment = get_object_or_404(Comment, pk=pk)
if comment.author != request.user:
return redirect(comment.post)
if request.method == 'POST':
comment.delete()
return redirect(comment.post)
return render(request, 'community/comment_confirm_delete.html', {
'comment':comment,
})
models.py
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-id']
def get_edit_url(self):
return reverse('comment_edit', args=[self.post.pk, self.pk])
def get_delete_url(self):
return reverse('comment_delete', args=[self.post.pk, self.pk])
urls.py
urlpatterns = [
path('', PostListView.as_view(), name='community-home'),
path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
path('post/<int:post_pk>/comment/new',views.comment_new, name='comment_new'),
path('post/<int:post_pk>/comment/<int:pk>/edit',views.comment_edit, name='comment_edit'),
path('post/<int:post_pk>/comment/<int:pk>/delete',views.comment_delete, name='comment_delete'),
мой html
<a href="{% url 'comment_new' post.id %}">hello</a>
<ul>
{% for comment in post.comment_set.all %}
<li>
{{comment.message}} by {{comment.author}} at {{comment.created_at}}
{% if comment.author == request.user %}
<a href="{{ comment.get_edit_url }} ">
edit
</a>
<a href="{{comment.get_delete_url}}">delete</a>
{% endif %}
</li>
{% endfor %}
</ul>
forms.py
from django import forms
from .models import Comment
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['message']