Django含隐藏字段表单提交失败问题求助
解决Django表单隐藏ForeignKey字段提交报错问题
你遇到的问题是因为给cid字段设置HiddenInput widget时,表单会将该字段纳入验证范围,但你既没在表单中传递字段值,也没在初始化时提供初始值,导致验证失败提示"此字段必填"。以下是几种可行的解决方案:
方案一:不将cid纳入表单,直接在视图中关联(最简方案)
保持你当前注释掉widget的代码,利用视图中已有的cid参数,在表单验证通过后直接给实例赋值,这样表单不会渲染cid字段,提交也正常。注意修正视图中模型类的拼写错误:
views.py 修正后:
def create_contact(request, cid): cr = Cr.objects.get(id=cid) # 模型类名Cr需大写 if request.method == 'POST': form = CtForm(request.POST) if form.is_valid(): form.instance.cid_id = cid form.save() return render(request, 'create_contact.html', {'form': form, 'cr': cr,}) else: form = CtForm() return render(request, 'create_contact.html', {'form': form, 'cr': cr,})
forms.py 保持不变:
class CtForm(ModelForm): class Meta: model = Contact fields = ["name", "email"] # widgets = {'cid': HiddenInput()} 保持注释
方案二:将cid设为隐藏字段并传递初始值
如果一定要通过隐藏字段传递cid,需要将其加入表单字段列表,并在初始化表单时传入初始值,确保提交时字段有值:
forms.py 修改后:
from django.forms import HiddenInput class CtForm(ModelForm): class Meta: model = Contact fields = ["name", "email", "cid"] # 加入cid字段 widgets = {'cid': HiddenInput()} # 设置为隐藏输入
views.py 修改后:
def create_contact(request, cid): cr = Cr.objects.get(id=cid) if request.method == 'POST': form = CtForm(request.POST) if form.is_valid(): form.save() # 无需手动赋值,表单已包含cid的值 return render(request, 'create_contact.html', {'form': form, 'cr': cr,}) else: # 初始化表单时传入cid的初始值 form = CtForm(initial={'cid': cid}) return render(request, 'create_contact.html', {'form': form, 'cr': cr,})
模板代码无需修改,form.as_table会自动渲染隐藏的cid字段,提交时携带正确值通过验证。
方案三:排除cid字段,明确不纳入表单验证
使用exclude参数排除cid字段,让表单完全不处理该字段,同样在视图中手动关联:
forms.py 修改后:
class CtForm(ModelForm): class Meta: model = Contact exclude = ["cid"] # 排除cid字段,表单不验证也不渲染它
views.py 同方案一,验证通过后给form.instance.cid_id赋值即可。
内容的提问来源于stack exchange,提问作者Peanut Gallery
相关产品推荐
相关产品推荐

