Django项目中如何自动用当前登录用户名填充作者字段
解决Django Reviews应用自动填充当前登录用户为作者的问题
我太懂你查了一堆资料却没搞定的挫败感!大概率是很多教程还停留在旧版Django的写法,或者你在细节上没踩对节奏。针对你的reviews类博客应用,我给你梳理一套当前Django版本通用的解决方案:
第一步:修正你的Models代码
首先模型类名要符合Python规范(首字母大写),同时把作者字段设置为关联User模型的外键:
from django.db import models from django.contrib.auth.models import User # 模型类名首字母大写,符合PEP8规范 class Reviews(models.Model): title = models.CharField(max_length=200) # 示例标题字段,可根据你的需求调整 content = models.TextField() # 示例内容字段 # 关联User模型,用户删除时关联的评论也会被删除(可根据需求改on_delete策略) author = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) # 自动添加创建时间 def __str__(self): return self.title # 后台显示标题,方便管理
第二步:配置表单(隐藏作者字段)
创建表单时要排除author字段,不让用户在前端手动输入:
from django import forms from .models import Reviews class ReviewForm(forms.ModelForm): class Meta: model = Reviews # 排除author字段,前端不显示 exclude = ['author'] # 或者直接指定要显示的字段:fields = ['title', 'content']
第三步:在视图中自动填充作者
分两种常用视图类型来实现:
基于函数的视图(FBV)
用commit=False先获取表单实例,再赋值当前用户,最后保存:
from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .models import Reviews from .forms import ReviewForm # 必须登录才能访问,避免匿名用户报错 @login_required def create_review(request): if request.method == 'POST': form = ReviewForm(request.POST) if form.is_valid(): # 先不保存到数据库,获取未提交的实例 review = form.save(commit=False) # 给author字段赋值当前登录用户 review.author = request.user review.save() # 现在才真正保存到数据库 return redirect('review_list') # 跳转到你的评论列表页 else: form = ReviewForm() return render(request, 'create_review.html', {'form': form})
基于类的视图(CBV)
重写form_valid方法,给表单实例设置作者:
from django.views.generic.edit import CreateView from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from .models import Reviews from .forms import ReviewForm # 登录保护+创建视图 class ReviewCreateView(LoginRequiredMixin, CreateView): model = Reviews form_class = ReviewForm success_url = reverse_lazy('review_list') # 成功提交后跳转的页面 def form_valid(self, form): # 给表单实例的author字段赋值当前登录用户 form.instance.author = self.request.user # 调用父类的form_valid完成后续保存逻辑 return super().form_valid(form)
关键注意事项
- 登录保护必须加:不管是FBV的
@login_required还是CBV的LoginRequiredMixin,一定要确保只有登录用户才能访问创建页面,否则request.user会是匿名用户,赋值时会报错。 - 字段类型要正确:不要用
CharField存用户名,必须用ForeignKey关联User模型,这是Django用户关联的标准做法,后续扩展功能(比如查看用户所有评论)也更方便。 - 版本兼容:以上写法适用于Django 3.x到5.x的所有版本,完全适配当前的官方规范,不会出现旧版API废弃的问题。
内容的提问来源于stack exchange,提问作者livingcobble
相关产品推荐
相关产品推荐

