Django登录用户评论优化:固定作者与实现页面内评论
我来帮你搞定这两个问题,一步步来:
要实现这个,我们需要让系统自动获取当前登录的用户,而不是让用户手动选择,具体步骤如下:
添加登录验证
首先确保只有登录用户才能提交评论,在你的comment_post视图上方加上@login_required装饰器(记得先导入对应模块):from django.contrib.auth.decorators import login_required @login_required def comment_post(request, slug): # 原视图代码...自动赋值当前用户
在表单验证通过后,直接把request.user赋值给评论的author字段,不用用户手动选择:if form.is_valid(): comment = form.save(commit=False) comment.post = post comment.author = request.user # 新增这一行,绑定当前登录用户 comment.save() return redirect('samplepost', slug=post.slug)修改评论表单
既然不需要用户选择作者,就要把表单里的author字段隐藏掉。如果你的CommentForm是ModelForm,修改它的Meta类,只包含body字段:# 假设你的forms.py里的CommentForm是这样的 from django import forms from .models import Comment class CommentForm(forms.ModelForm): class Meta: model = Comment fields = ['body'] # 只保留评论内容字段,排除author优化数据库模型(可选)
现在评论作者必然是登录用户,所以可以把models.py里Comment的author字段的null=True去掉,避免数据库出现空值:author = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
要让用户在文章详情页直接提交评论,不用跳转到单独页面,我们需要把评论表单嵌入文章页,调整视图逻辑:
调整文章详情视图
假设你的文章详情视图是samplepost,我们需要把CommentForm传递给文章详情模板,同时可以顺便处理评论提交(也可以保留原comment_post视图,用表单action指向它)。这里先讲整合的方式,更简洁:# view.py中修改samplepost视图 from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, redirect, render from .models import Post, Comment from .forms import CommentForm def samplepost(request, slug): post = get_object_or_404(Post, slug=slug) # 获取该文章的所有评论,用于页面显示 comments = post.comments.all() if request.method == "POST": # 处理评论提交 form = CommentForm(request.POST) if form.is_valid() and request.user.is_authenticated: comment = form.save(commit=False) comment.post = post comment.author = request.user comment.save() # 提交后刷新当前页面 return redirect('samplepost', slug=slug) else: form = CommentForm() return render(request, 'blogapp/samplepost.html', { 'post': post, 'comments': comments, 'form': form })在文章详情模板中嵌入表单
打开你的文章详情模板(比如samplepost.html),在合适的位置(比如文章内容下方)添加评论表单和评论列表:<!-- 文章内容区域 --> <h1>{{ post.title }}</h1> <p>{{ post.content }}</p> <!-- 评论表单 --> <div class="comment-section"> <h3>发表你的评论</h3> {% if user.is_authenticated %} <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn">提交评论</button> </form> {% else %} <p>请<a href="{% url 'login' %}">登录</a>后发表评论</p> {% endif %} </div> <!-- 评论列表 --> <div class="comments-list"> <h3>评论 ({{ comments.count }})</h3> {% for comment in comments %} <div class="comment-item"> <p><strong>{{ comment.author.username }}</strong> · {{ comment.date_created|date:"Y-m-d H:i" }}</p> <p>{{ comment.body }}</p> </div> {% empty %} <p>还没有评论,快来抢沙发吧!</p> {% endfor %} </div>移除单独的评论页面(可选)
现在评论表单已经嵌入文章页,原来的comment.html页面和comment_post视图如果不需要的话,可以删除;如果想保留,也可以继续用,只要把表单的action属性指向comment_post的URL即可:<form method="post" action="{% url 'comment_post' post.slug %}"> {% csrf_token %} {{ form.as_p }} <button type="submit">提交评论</button> </form>
这样修改后,用户就能在文章页面直接提交评论,而且评论作者会自动绑定为当前登录用户,不用手动选择啦!
内容的提问来源于stack exchange,提问作者RealAlpha

