Как я могу связать комментарий с соответствующим постом в Django?
Я создаю проект Django, в котором у меня есть индексная страница со списком всех сообщений. Пользователь может нажать на название поста, и это приведет его на страницу с подробной информацией о посте (дата, содержание, категория). На этой странице также есть ссылка, которая ведет пользователя на форму, где он может оставить комментарий. После того, как пользователь нажмет кнопку отправить, он должен вернуться на страницу с подробной информацией о посте, и комментарий должен быть там. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что комментарий автоматически присваивается первому посту в списке индекса, а не тому посту, который посетил пользователь (я думаю, это может быть связано с текущими настройками по умолчанию в моих моделях, но как еще я могу получить id поста?). Как я могу сделать так, чтобы комментарий был отнесен к правильному посту? Я перепробовал все модели и представления, но, похоже, ничего не работает. Спасибо за помощь, я думаю, что решение может быть простым, но я не могу найти его нигде.
Вот мои соответствующие модели:
class UserPost(models.Model):
title = models.CharField(max_length=255)
category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User, default=1,
on_delete = models.CASCADE
)
#id = models.AutoField(primary_key=True)
def __str__(self):
"""String for representing the UserPost object."""
return self.title
def get_absolute_url(self):
"""Returns the url to access a detail record for this user post."""
return reverse('userpost-detail', args=[str(self.id)])
class Comment(models.Model):
author = models.ForeignKey(User, default=1,
on_delete = models.CASCADE
)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
def comment_default():
return {UserPost.id}
post = models.ForeignKey(UserPost, default= comment_default, on_delete=models.CASCADE, related_name="comments")
def __str__(self):
"""String for representing the comment object."""
return '%s - %s - %s' % (self.post.title, self.author, self.created_on)
def get_absolute_url(self):
return reverse('userpost-detail', args=[str(self.post.id)])
А мои взгляды:
class UserPostDetailView(generic.DetailView):
model = UserPost
#post = UserPost.objects.get(id=id)
#comments = Comment.objects.filter(Comment.post)
def get_context_data(self, **kwargs):
context = super(UserPostDetailView, self).get_context_data(**kwargs)
context['Comment'] = UserPost.comments
return context
class PostCreate(CreateView):
model = UserPost
fields = ['title', 'category', 'content']
class CommentCreate(CreateView):
model = Comment
fields = ['post','content']
А мой html:
{% extends "base.html" %}
{% block page_content %}
<h1>Title: {{ userpost.title }}</h1>
<p><strong>Author:</strong> {{ userpost.author }}</p>
<p><strong>Content:</strong> {{ userpost.content }}</p>
<p><strong>Category:</strong> {{ userpost.category }}</p>
<a class="btn btn-primary" href="{% url 'comment-create' %}" role="button">Leave a Comment</a>
<h3>Comments:</h3>
{% for comment in userpost.comments.all %}
<p>
On {{comment.created_on.date }}
<b>{{ comment.author }}</b> wrote:
</p>
<p>{{ comment.content }}</p>
<hr>
{% endfor %}
{% endblock %}
Для этого вам нужно передать ID поста в вашем url.
path("comment/<int:post_id>/", CommentCreateView, name="comment-create")
Теперь в шаблоне
<a class="btn btn-primary" href="{% url 'comment-create' userpost.id %}" role="button">Leave a Comment</a>
Виды
class CommentCreateView(CreateView):
model = Comment
fields = ['content'] # remove field post here
def form_valid(self, form):
form.instance.post_id = self.kwargs.get("post_id")
return super().form_valid(form)