Как я могу связать комментарий с соответствующим постом в 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 }}&nbsp;
        <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)
Вернуться на верх