Django表单无法获取request.POST值,移除构造函数后恢复正常
以下是你的表单__init__方法导致问题的几个核心原因:
未调用父类初始化方法
自定义__init__时如果漏掉super().__init__(*args, **kwargs),Django表单的核心初始化流程(包括绑定POST数据、初始化字段规则、加载验证逻辑)都不会执行。此时POST数据根本没被绑定到表单字段上,form.is_valid()自然会失败,直接调用save()时就会因为distanza_km字段无值触发非空约束错误。错误修改必填字段属性
如果在__init__里把distanza_km字段的required设为False,或者意外删除了该字段,又或者重置了字段的类型/默认值,会导致表单无法正确读取POST中的该字段值。验证阶段会判定这个必填字段为空,进而引发后续的保存错误。破坏字段数据绑定流程
比如在调用父类__init__之前就修改字段(比如修改widget或字段类型),会干扰Django对POST数据的解析绑定。例如distanza_km是IntegerField,若在__init__中错误修改了字段类型或widget,会导致POST里的数值字符串无法被正确转换,最终字段值为空。自定义验证逻辑出错
如果在__init__中添加了额外的验证逻辑,或者手动修改了cleaned_data但逻辑有误,可能会清空distanza_km的值或标记其为无效,导致is_valid()不通过,保存时触发约束错误。
错误示例与修正
错误的__init__写法(漏掉super调用):
class ViaggioForm(forms.ModelForm): def __init__(self, *args, **kwargs): # 未调用父类初始化,破坏表单核心逻辑 self.fields['altro_campo'].widget = forms.TextInput(attrs={'class': 'form-control'})
正确的写法(先调用父类初始化):
class ViaggioForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 必须先执行父类初始化 self.fields['altro_campo'].widget = forms.TextInput(attrs={'class': 'form-control'})
内容的提问来源于stack exchange,提问作者doduz

