Django中如何通过表单自动获取提交表单的用户
解决Django表单自动绑定当前登录用户的问题
问题根源
你当前的表单因为设置了fields = '__all__',把username外键字段渲染成了下拉框让用户选择;而排除该字段后,又没在视图里手动给字段赋值,导致后台该字段为空。
修复步骤
1. 修改表单文件(forms.py)
把username字段从表单中移除,不让用户看到和选择:
class Requestpaymentform(ModelForm): class Meta: model = Requestpayment # 只保留需要用户手动填写的字段,排除username fields = ['useremail', 'accountmail', 'accountphonenumber', 'coinsrequested']
2. 修改视图文件(views.py)
在表单验证通过后,手动将当前登录用户绑定到username字段,再保存到数据库:
@login_required(login_url='login') def redeemcoins(request): # 注意要实例化表单(加括号) form = Requestpaymentform() if request.method == 'POST': form = Requestpaymentform(request.POST) if form.is_valid(): # 先暂存表单数据,不提交到数据库 form_instance = form.save(commit=False) # 绑定当前登录用户到username字段 form_instance.username = request.user # 可选:自动填充useremail,不用用户手动输入 form_instance.useremail = request.user.email # 正式保存数据 form_instance.save() return redirect('home') # GET请求时返回表单页面 return render(request, '你的模板文件名.html', {'form': form})
额外优化建议
useremail字段可以直接从登录用户的email属性获取,不需要用户填写,可进一步从表单字段中移除,减少用户操作同时避免输入错误。- 模型中的
username字段建议改名为user,更符合Django命名规范,避免和内置的username属性混淆。
内容的提问来源于stack exchange,提问作者mika
相关产品推荐
相关产品推荐

