如何在Django博客中自动以登录用户为作者,无需用户输入用户名
嘿,我来帮你搞定这个问题!你说得太对了,把用户赋值的逻辑放在views.py里才是最合理的做法,完全不用折腾隐藏字段那一套,咱们一步步来调整:
1. 先调整表单:移除不需要用户输入的字段
首先修改你的PostForm和CommentForm,把user字段从fields里删掉——既然不需要用户手动填写,那表单里就别显示它了:
# blog.forms class PostForm(forms.ModelForm): class Meta: model = Post fields = ['title', 'text', 'image'] # 移除'user'字段 class CommentForm(forms.ModelForm): class Meta: model = Comment fields = ('text',) # 同样移除'user'字段
2. 修改文章发布视图:自动赋值当前登录用户
在create_post视图里,表单验证通过后,先用commit=False创建文章对象但不保存到数据库,然后给它的user字段赋值当前登录的用户,最后再保存:
# blog.views @login_required def create_post(request): if request.method == 'POST': # 注意要加上request.FILES,不然图片上传会失效! post_form = PostForm(request.POST, request.FILES) if post_form.is_valid(): post = post_form.save(commit=False) # 先不提交到数据库 post.user = request.user # 自动把当前登录用户设为作者 post.save() # 保存后跳转到刚发布的文章详情页,体验更友好 return redirect('post-detail', slug=post.slug) else: print(post_form.errors) else: post_form = PostForm() context = {'post_form': post_form} return render(request, 'blog/addpost.html', context)
3. 优化评论功能:让评论也自动关联登录用户
你的Comment模型里user字段现在是CharField,建议改成和Post一样的ForeignKey关联User模型,这样更符合Django的设计逻辑:
# blog.models class Comment(models.Model): post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name='comments') # 把CharField改成ForeignKey,关联User模型 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comments') text = models.TextField() created_date = models.DateTimeField(default=timezone.now) approved_comment = models.BooleanField(default=False) def approve_comment(self): self.approved_comment = True self.save() def __str__(self): return f"{self.user.username}: {self.text[:50]}" # 显示用户名+评论摘要,更清晰
然后修改评论视图,同样自动赋值当前登录用户,还要加上@login_required确保只有登录用户能评论:
# blog.views @login_required # 新增:只有登录用户才能评论 def add_comment_to_post(request, slug): post = get_object_or_404(Post, slug=slug) if request.method == 'POST': form = CommentForm(request.POST) if form.is_valid(): comment = form.save(commit=False) comment.post = post comment.user = request.user # 自动赋值当前登录用户 comment.save() return redirect('post-detail', slug=slug) else: form = CommentForm() template_name = 'blog/add_comment_to_post.html' return render(request, template_name, {'form': form})
4. 模板小调整:处理图片上传&显示当前发布用户
在你的addpost.html模板里,记得给表单加上enctype="multipart/form-data",否则无法处理图片上传;另外你原来的显示当前用户的代码可以保留,让用户确认自己的发布身份:
{% if user.is_authenticated %} <p>发布为: {{ user.username }}</p> {% endif %} <form method="POST" enctype="multipart/form-data"> {% csrf_token %} {{ post_form.as_p }} <button type="submit">发布文章</button> </form>
这样调整后,用户发布文章和评论时都不需要手动输入用户名,完全由系统自动关联当前登录用户,所有逻辑都集中在视图里,既安全又符合Django的最佳实践~
内容的提问来源于stack exchange,提问作者Yucehan Kucukmotor
相关产品推荐
相关产品推荐

