Проблема поиска комментария для ответа на него с помощью django-mptt для вложенных комментариев в блоге
Я пытаюсь создать систему вложенных комментариев с помощью djano-mptt. У меня все работает, и комментарии отображаются так, как задумано. Однако, у меня возникла проблема с логикой выбора пользователем комментария для ответа.
Через форму я могу отобразить все посты и родительские поля, что позволяет пользователю выбрать пост и комментарий. Но проблема в том, что они могут комментировать любой пост и любой комментарий в списке. Пытаюсь реализовать логику, при которой, если пользователь находится на этом посте, он может комментировать только этот пост и может выбрать, на какой комментарий (если захочет) ответить.
Вот модель:
class Comment(MPTTModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
name = models.CharField(max_length=100)
parent = TreeForeignKey('self', on_delete=models.CASCADE,
null=True, blank=True, related_name='children')
body = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
class MPTTMeta:
order_insertion_by = ['created_on']
def __str__(self):
return f"Comment {self.body} by {self.name}"
Вид:
def CommentView(request, pk):
post = get_object_or_404(Post, id=request.POST.get('post_id'))
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
comment_form.instance.name = request.user.username
comment = comment_form.save(commit=False)
comment.post = post
comment.save()
else:
comment_form = CommentForm()
return HttpResponseRedirect(reverse('post_detail', args=[str(pk)]))
Форма:
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('post', 'body', 'parent',)
labels = {
'body': '',
'parent': ''
}
widgets = {
'body': forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Write Your Comment Here'}),
'parent': forms.Select(attrs={'required': False}),
}
Комментарии к отображению шаблона:
<div class="blog-comment">
<h3>Comments</h3>
<ul class="comments">
{% load mptt_tags %}
{% recursetree comments.all %}
<li >
<img class="avatar"
src="">
<div class="post-comments">
<p class="meta">{{ node.created_on }} {{ node.name }}
says :
<p id="{{ node.id }}">{{ node.body }}</p>
</div>
</li>
{% if not node.is_leaf_node %}
<ul class="comments">
<li>{{ children }}</li>
</ul>
{% endif %}
{% endrecursetree %}
</ul>
</div>
Форма комментария в шаблоне:
<div>
{% if user.is_authenticated %}
<p>Leave a comment as: {{ user.username }}</p>
<form action="{% url 'comment_post' post.pk %}" method="POST">
{% csrf_token %}
{{ comment_form }}
<button type="submit" name="post_id" value="{{ post.id }}"
class="btn btn-primary mt-3">Submit</button>
</form>
{% else %}
<small><a href="{% url 'login' %}">Login</a> to comment</small>
{% endif %}
</div>
Любая помощь будет очень признательна.