[Django提交评论按钮时出现视图错误

问题描述 投票:0回答:3

Helloo,

我为我的博客帖子创建了一个评论按钮,提交评论按钮后,我收到“此页面无效”的信息,我不知道原因。

我可以从管理员添加评论,但不能以用户身份从网站提交

我不确定views.py中需要更改什么

class PostDetailView(DetailView):
    model = Post
    template_name = "post_detail.html"

    def get_context_data(self, *args, **kwargs):
        context = super(PostDetailView, self).get_context_data()
        post = get_object_or_404(Post, id=self.kwargs['pk'])
        comments = Comment.objects.filter(post=post).order_by('-id')
        total_likes = post.total_likes()
        liked = False
        if post.likes.filter(id=self.request.user.id).exists():
            liked = True

        if self.request.method == 'POST':
            comment_form = CommentForm(self.request.POST or None)
            if comment_form.is_valid():
                content = self.request.POST.get('content')
                comment = Comment.objects.create(
                    post=post, user=request.user, content=content)
                comment.save()
                return HttpResponseRedirect(post.get_absolute_url())
        else:
            comment_form = CommentForm()

        context["total_likes"] = total_likes
        context["liked"] = liked
        context["comments"] = comments
        context["comment_form"] = comment_form
        return context


class PostListView(ListView):
    model = Post
    template_name = "score.html"
    ordering = ['-date_posted']
    context_object_name = 'posts'
    paginate_by = 5

这里是模板

            <form method="post" class="comment-form" action=".">
            {% csrf_token %}
            {{ comment_form.as_p }}
            {% if request.user.is_authenticated %}
            <input type="submit" value="Submit" class="btn btn-outline-success">
            {% else %}
            <input type="submit" value="Submit" class="btn btn-outline-success" disabled> You must be Logged in to Comment
            {% endif %}
            </form>

这里是models.py

class Post(models.Model):
    designer = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    likes = models.ManyToManyField(
        User, related_name='liked')
    slug = models.SlugField(blank=True, null=True, max_length=120)

     def save(self, *args, **kwargs):
         if not self.slug:
             self.slug = slugify(self.title)
         super(Post, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse("score:post-detail", kwargs={'slug': self.slug})

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # reply = models.ForeignKey('Comment', null=True, related_name="replies")
    content = models.TextField(max_length=160)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{}-{}'.format(self.post.title, str(self.user.username))
django django-views
3个回答
0
投票

我认为您在Post模型中缺少total_likes()方法:

class Post(models.Model):
    # ...

    def total_likes(self):
        return self.likes.all().count()

或者,您可以更改视图:

class PostDetailView(DetailView):

    def get_context_data(self, *args, **kwargs):
        # ...
        total_likes = post.likes.all().count()
        # ...

0
投票

您正在为PostDetailView使用父类DetailView。但是,DetailView中未定义发布方法。我相信,当您提交评论时,您会得到DetailView。您可以从浏览器开发人员工具中进行检查。

我建议您使用单独的视图来保存您的评论。


0
投票

[您需要在HTTP 405 method not allowed上显式定义post方法,这是您的视图和表单的样子

forms.py

DetailView

views.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = '__all__'
        widgets = {'user': forms.HiddenInput,
                   'post': forms.HiddenInput}
© www.soinside.com 2019 - 2024. All rights reserved.