Django 如何将模型字段默认值设为登录用户的邮箱
解决Django中Job模型contact_email默认设为登录用户邮箱的问题
你没法直接在模型的contact_email字段设置默认值为当前登录用户邮箱——模型层拿不到请求上下文(也就是request.user),得在视图或者表单层处理,下面给你两种靠谱的方案:
方案一:在视图中处理(最简单直接)
修改views.py里的manage_jobs函数,先区分请求方法,GET请求显示空表单,POST请求处理提交,同时在保存表单时手动赋值邮箱和关联用户:
@login_required(login_url='login') def manage_jobs(request): if request.user.is_employee: return redirect('home') # 区分GET/POST请求,避免GET请求时表单报错 if request.method == 'POST': form = JobForm(request.POST) if form.is_valid(): # 先不提交到数据库,用commit=False获取Job实例 job = form.save(commit=False) # 赋值当前用户邮箱到contact_email job.contact_email = request.user.email # 关联当前用户到Job的user字段(建议把模型里的user字段改成null=False,更合理) job.user = request.user job.save() # 重定向防止重复提交 return redirect('manage_jobs') else: # GET请求时实例化空表单 form = JobForm() # 用user字段筛选用户的Job,比contact_email更可靠,避免邮箱变更后数据不一致 jobs = Job.objects.filter(user=request.user) context = {"form":form, "jobs":jobs} return render(request, 'employer/manage-jobs.html', context)
方案二:在表单层设置初始值(适合需要让用户看到默认邮箱的场景)
修改forms.py,让表单初始化时接收当前用户,把contact_email的初始值设为用户邮箱:
class JobForm(ModelForm): class Meta: model = Job fields = ('company', 'description', 'role', 'area_of_filming', 'contact_email') def __init__(self, *args, **kwargs): # 从参数中取出用户信息 self.user = kwargs.pop('user', None) super().__init__(*args, **kwargs) # 如果有用户,设置contact_email的初始值 if self.user: self.fields['contact_email'].initial = self.user.email
然后在视图里实例化表单时传入user参数:
# GET请求时 form = JobForm(user=request.user) # POST请求时 form = JobForm(request.POST, user=request.user)
额外优化建议
- 把Job模型里的
user字段改成null=False,因为每个Job都应该归属一个用户,逻辑更严谨:
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
- 后续筛选用户的Job时,优先用
user=request.user,不要依赖contact_email,避免用户修改邮箱后数据关联失效。
内容的提问来源于stack exchange,提问作者Ruairí
相关产品推荐
相关产品推荐

