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
相关产品推荐
相关产品推荐

