Django表单提交报IntegerField无value_from_datadict属性问题
问题根源
错误出在表单字段定义时混淆了表单字段类型和**表单控件(widget)**的概念:
- Django表单的
widget参数仅支持传入表单控件类,作用是指定字段渲染的HTML元素类型、负责从POST请求的提交数据中提取对应字段值,所有控件类都实现了value_from_datadict方法。 - 你新增的rating字段写法为
rating = forms.CharField(widget=forms.IntegerField, required=True),传入widget参数的forms.IntegerField是整数类型的表单字段类,不是控件类,本身没有value_from_datadict方法,因此提交时抛出属性错误。 - 原表单能正常运行是因为
feedBACK字段的写法符合规则:forms.CharField是文本字段类型,传入的forms.Textarea是多行文本输入控件,参数类型匹配。
修复方案
根据rating字段实际用途选对应写法即可:
- 如果rating需要接收整数评分,直接使用整数字段即可,Django会自动为整数字段匹配默认的数字输入控件:
class FeedBackForm(forms.Form): feedBACK = forms.CharField(widget=forms.Textarea, required=True) rating = forms.IntegerField(required=True)
- 如果需要自定义rating字段的渲染控件,比如指定数字输入框、下拉选择评分等,
widget参数必须传入对应控件类,不能传入字段类,例如使用数字输入控件的写法:
class FeedBackForm(forms.Form): feedBACK = forms.CharField(widget=forms.Textarea, required=True) rating = forms.IntegerField(widget=forms.NumberInput, required=True)
注意:表单字段类(如
CharField/IntegerField)负责数据类型转换、输入校验,控件类(如Textarea/NumberInput)负责前端渲染、提取提交数据,二者职责完全不同,不能混用到widget参数中。
内容的提问来源于stack exchange,提问作者Mossaddak
相关产品推荐
相关产品推荐

