Django提交ModelForm时如何将已登录用户传入关联外键字段
问题原因
你当前的写法是给表单实例额外添加了一个自定义的user属性,这个属性和表单关联的UserInfo模型的外键字段没有任何关联,调用form.save()时并不会把这个值写入数据库,所以字段一直为空。
解决方法
修改视图函数中表单验证通过后的保存逻辑,调用form.save(commit=False)先获取未提交到数据库的模型实例,给这个实例的user字段赋值后再执行保存操作即可。
修改后的视图代码
from django.contrib.auth.decorators import login_required # 加登录验证装饰器,确保只有登录用户能提交表单,避免request.user为匿名用户报错 @login_required def userForm(request): if request.method == "POST": form = InfoForm(request.POST) if form.is_valid(): # 先获取模型实例,暂不提交到数据库 user_info = form.save(commit=False) # 给模型实例的user外键字段赋值 user_info.user = request.user # 正式保存到数据库 user_info.save() return redirect('profile') else: form = InfoForm() context = { 'form':form } return render(request, 'fitness/user_form.html', context)
额外优化建议
- 如果
UserInfo的user字段为必填项,可以把模型字段定义里的null=True, blank=True去掉,从数据库层面避免空值产生 - 你当前模板里加了
enctype="multipart/form-data",如果表单没有上传文件的需求可以删除该属性,不影响现有功能
内容的提问来源于stack exchange,提问作者Fredy
相关产品推荐
相关产品推荐

