【问题标题】:How to update and delete comments in Django如何在 Django 中更新和删除评论
【发布时间】:2021-02-26 12:33:48
【问题描述】:

我正在努力更新和删除用户创建的 cmets,我已经为 cmets 创建了基于类的视图,但由于出现错误我不确定如何继续

是否有任何其他选项可供用户删除和编辑他们的 cmets?

我目前收到的错误是:

FieldError at /blog/sdsdssds/update_comment/
Cannot resolve keyword 'slug' into field. Choices are: content, created, id, post, post_id, updated, user, user_id

任何想法如何解决这个错误以及它的原因是什么?

这里是models.py

class Post(models.Model):
    title = models.CharField(max_length=100, unique=True)
    content = RichTextUploadingField(null=True, blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author')
    date_posted = models.DateTimeField(default=timezone.now)
    slug = models.SlugField(blank=True, null=True, max_length=120)
    liked = models.ManyToManyField(User, default=None, blank=True, related_name='liked')

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])

这里是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']))

这是模板:

            {% for comment in comments %}
                <ul class="list-unstyled">
                  <li class="media">
                    <img class="rounded-circle article-img" src="{{ comment.post.author.profile.image.url }}">
                      <div class="media-body">
                      <h5 class="mt-0 mb-1">{{comment.user| capfirst}}<small class="text-muted">- {{ comment.created}}</small> </h5>
                        <hr class="solid mt-0">
                        {{ comment.content}}
                      </div>
                  </li>
                </ul>
               {% 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 %}
            {% endfor %}

这里是 urls.py

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

【问题讨论】:

  • 我们需要查看您的 Post 模型以提供帮助。
  • @m.arthur 我添加了 Post 模型

标签: python django django-views django-templates django-class-based-views


【解决方案1】:

重命名 Post 模型中的 slug 字段,我认为这会导致冲突。

class Post(models.Model):
    title = models.CharField(max_length=100, unique=True)
    content = RichTextUploadingField(null=True, blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author')
    date_posted = models.DateTimeField(default=timezone.now)
    slug_field = models.SlugField(blank=True, null=True, max_length=120)
    liked = models.ManyToManyField(User, default=None, blank=True, related_name='liked')


【讨论】:

  • 试过了,但还是同样的错误...创建评论工作正常,问题在于更新和删除
  • 你的 url 模式是否捕获了 slug?
  • 是的,发布你的 urls.py。您可能需要使用
  • 抱歉刚刚将 urls.py 添加到问题中。
  • @devdrc 我更新了slug=self.post.slug,但现在显示相同的错误,但突出显示来自test函数comment = self.get_object()的错误
【解决方案2】:

尽管您的评论模型没有,但您正在将 slug 传递到您的 Url。您需要传递到 url 的是评论的唯一 ID,而不是它所属的帖子的 slug。

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2022-07-13
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多