Django表单后台自动保存Customer字段问题求助
解决表单自动保存Customer字段(无需显示)的问题
问题描述
希望提交表单时自动保存Customer字段,不在表单中显示该字段。当前在forms.py中包含customer字段时,下拉框显示且保存正常,但移除该字段后无法保存。
修改步骤
1. 调整forms.py
移除fields中的customer字段,同时删除对customer字段queryset的设置(字段已不在表单中,无需再处理):
class InfringerForm(ModelForm): def __init__(self, customer, *args, **kwargs): super(InfringerForm, self).__init__(*args, **kwargs) # 仅保留status字段的权限过滤 self.fields['status'].queryset = Status.objects.filter(customer=customer) class Meta: model = Infringer fields = ['name', 'brand_name', 'status'] # 移除customer字段
2. 修改views.py
表单验证通过后,先以commit=False创建实例,手动补充customer字段值后再保存到数据库:
@login_required(login_url='login') def createInfringer(request): customer = request.user.customer form = InfringerForm(customer=customer) if request.method == 'POST': # 用关键字参数传递参数,避免顺序混淆 form = InfringerForm(customer=customer, data=request.POST) if form.is_valid(): # 创建实例但暂不提交到数据库 infringer_instance = form.save(commit=False) # 手动赋值customer字段 infringer_instance.customer = customer # 最终保存到数据库 infringer_instance.save() return redirect('infringer-list') context = {'form': form} return render(request, 'base/infringement_form.html', context)
关键说明
- 移除表单中的
customer字段后,表单不会自动处理该字段的赋值,必须手动为实例补充字段值。 commit=False可以让表单生成实例但不立即提交,方便我们补充字段后再完成保存。- 修正原代码中的缩进错误:
return redirect需要放在if form.is_valid()的代码块内,否则无论表单是否验证通过都会跳转。
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

