You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django:已认证用户评论表单实现问题求助

解决已登录用户无法评论博客文章的问题

看起来你已经有了BlogPost模型,但缺少评论相关的核心定义,这大概率是功能无法实现的关键原因。我来帮你一步步搭建完整的评论功能:

1. 完善models.py,添加评论模型

先在你的models.py里补充Comment模型,关联用户和目标博客文章:

from django.db import models
from django.conf import settings
from django.urls import reverse

class BlogPost(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    blog_title = models.CharField(max_length=200)
    blog_content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.blog_title

    def get_absolute_url(self):
        return reverse('blog_post_detail', args=[str(self.id)])

# 新增评论模型
class Comment(models.Model):
    post = models.ForeignKey(BlogPost, on_delete=models.CASCADE, related_name='comments')
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'Comment by {self.author.username} on {self.post.blog_title}'

这里的related_name='comments'能让你通过blog_post.comments.all()快速获取某篇文章的所有评论,非常方便。

2. 创建评论表单(forms.py)

在你的app目录下新建forms.py,定义仅需用户输入内容的评论表单:

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['content']
        widgets = {
            'content': forms.Textarea(attrs={'rows': 3, 'placeholder': '写下你的评论...'}),
        }

post和author字段会在视图里自动关联,不需要用户手动填写。

3. 更新视图,处理评论提交逻辑

假设你用类视图实现文章详情页,可以这样扩展:

from django.views.generic import DetailView, CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import BlogPost, Comment
from .forms import CommentForm

class BlogPostDetailView(DetailView):
    model = BlogPost
    template_name = 'blog/post_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 把评论表单和已有评论传到模板
        context['comment_form'] = CommentForm()
        context['comments'] = self.object.comments.all().order_by('-created_at')
        return context

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

    def form_valid(self, form):
        # 自动关联当前文章和登录用户
        form.instance.post = BlogPost.objects.get(pk=self.kwargs['pk'])
        form.instance.author = self.request.user
        return super().form_valid(form)

    def get_success_url(self):
        # 评论提交后返回原文章详情页
        return self.object.post.get_absolute_url()

如果用函数视图,逻辑类似:在文章详情页渲染表单,处理POST请求时验证表单、关联用户和文章,保存后重定向回详情页即可。

4. 配置urls.py

在app的urls.py里添加评论提交的路由:

from django.urls import path
from .views import BlogPostDetailView, CommentCreateView

urlpatterns = [
    path('post/<int:pk>/', BlogPostDetailView.as_view(), name='blog_post_detail'),
    path('post/<int:pk>/comment/', CommentCreateView.as_view(), name='add_comment'),
    # 其他已有的URL...
]

5. 在模板中渲染评论区和表单

在post_detail.html里添加评论展示和提交表单的代码:

<!-- 展示已有评论 -->
<div class="comments-section">
    <h3>评论 ({{ comments.count }})</h3>
    {% for comment in comments %}
        <div class="comment-card">
            <p><strong>{{ comment.author.username }}</strong> 于 {{ comment.created_at|date:"Y-m-d H:i" }} 说:</p>
            <p>{{ comment.content }}</p>
        </div>
    {% empty %}
        <p>还没有评论,快来抢沙发吧!</p>
    {% endfor %}
</div>

<!-- 评论表单:仅登录用户可见 -->
{% if user.is_authenticated %}
    <div class="comment-form">
        <h3>发表你的评论</h3>
        <form method="post" action="{% url 'add_comment' post.pk %}">
            {% csrf_token %}
            {{ comment_form.as_p }}
            <button type="submit">提交评论</button>
        </form>
    </div>
{% else %}
    <p>请<a href="{% url 'login' %}">登录</a>后发表评论</p>
{% endif %}

6. 执行数据库迁移

最后别忘了让新的Comment模型生效:

python manage.py makemigrations
python manage.py migrate

做完这些步骤,登录用户应该就能正常对任意文章发表评论了。如果还是有问题,可以检查这几点:

  • 模板里的user.is_authenticated是否正确判断用户登录状态
  • CommentCreateView是否添加了LoginRequiredMixin,确保只有登录用户能提交评论
  • 表单的action属性是否正确指向add_comment的路由

内容的提问来源于stack exchange,提问作者Asaduzzaman Sohel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:35:52