Обновление и удаление комментариев для сообщений в проекте Django не работает должным образом

#python #python-3.x #django #django-views #django-class-based-views

#python #python-3.x #django #django-просмотры #django-class-based-views

Вопрос:

Я добавил систему комментариев к сообщениям в проекте блога, и я пытаюсь добавить опцию для обновления и удаления комментариев пользователей, создавших комментарий.

Я пытаюсь использовать ту же концепцию, что и при создании сообщения и создании CBV для этих комментариев.

Создание комментария работает нормально и отображается правильно, единственное препятствие, с которым я сталкиваюсь, — это ошибка, когда пользователь нажимает на кнопку обновить или удалить при обновлении или удалении, она возвращает следующую ошибку:

Cannot resolve keyword 'slug' into the field. Choices are content, created, id, post, post_id, updated, user, user_id что имеет смысл, поскольку в модели комментариев нет Slug.

Мой вопрос в том, как обновить или удалить комментарий и вернуться на ту же страницу post.slug в шаблоне без получения этой ошибки?

Вот models.py

 class Post(models.Model):
    slug = models.SlugField(blank=True, null=True, max_length=120)
    ------------------------------------------------------------

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    content = models.TextField(max_length=300, validators=[validate_comment_text])
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now=True)
  

Вот views.py

 class PostCommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    form_class = CommentForm

    def form_valid(self, form):
        post = get_object_or_404(Post, slug=self.kwargs['slug'])
        form.instance.user = self.request.user
        form.instance.post = post
        return super().form_valid(form)

    def form_invalid(self, form):
        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug']))


class PostCommentUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Comment
    fields = ['content']  # What needs to appear in the page for update
    template_name = 'blog/post_detail.html'  # <app>/<model>_<viewtype>.html

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)

    def form_invalid(self, form):
        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug']))

    def test_func(self):
        comment = self.get_object()
        if self.request.user == comment.user:
            return True
        return False


class PostCommentDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Comment
    template_name = 'blog/postcomment_confirm_delete.html'  # <app>/<model>_<viewtype>.html

    def test_func(self):
        comment = self.get_object()
        if self.request.user == comment.user:
            return True
        return False

    def form_invalid(self, form):
        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug']))
  

вот urls.py

     path('blog/<slug:slug>/update_comment/',
         PostCommentUpdateView.as_view(), name='post-commentu'),
    path('blog/<slug:slug>/delete_comment/',
         PostCommentDeleteView.as_view(), name='post-commentd'),
  

вот шаблон:

 {% if comment.user == user %}
<div>
<a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'blog:post-commentu' post.slug %}">Update</a>
<a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'blog:post-commentd' post.slug %}">Delete</a>
</div>
{% endif %}
  

Комментарии:

1. попробуйте post__slug здесь return reverse('blog:post-detail', kwargs=dict(slug=self.kwargs['slug'])) или где именно возникает ошибка?

2. @hansTheFranz Я добавил href="{% url 'blog:post-commentu' post.slug %} , чтобы обновить комментарий, связанный с пользователем, но когда я нажимаю на него, он возвращает ошибку Cannot resolve keyword 'slug' into field. Choices are: content, created, id, post, post_id, updated, user, user_id