Django提交空选值时出现Field 'maca' expected a number报错如何解决
问题原因
- 表单提交空值时,
forms.ChoiceField默认会将空选项的值返回为空字符串'' - 模型层的
maca字段是IntegerField类型,仅接受数字、None两种合法值,无法自动将空字符串转换为符合要求的None,因此抛出类型不匹配的报错 - 你在
IntegerChoices中定义的__empty__属性仅会作用于模型字段自动生成的表单选项,或者ModelForm自动映射的字段,手动声明的普通ChoiceField不会触发自动转换空值的逻辑
修复方案
方法1:使用ModelForm自动映射字段(最推荐)
直接继承Django的ModelForm来生成表单,框架会自动根据模型字段的类型做适配,自动将提交的空值转换为None,不需要手动声明maca字段:
# forms.py 代码示例 from django.forms import ModelForm from .models import Boss class BossForm(ModelForm): class Meta: model = Boss fields = ['maca'] # 其余需要的字段也可以一起写在列表里
方法2:替换为TypedChoiceField指定类型转换
如果要手动声明表单字段,可以把ChoiceField替换为TypedChoiceField,通过参数指定类型转换规则和空值对应的取值:
# forms.py 修改后的字段代码 maca = forms.TypedChoiceField( required=False, choices=Boss.Maca.choices, widget=forms.Select, coerce=int, # 将提交的字符串值转换为整数 empty_value=None # 空值时返回None而非空字符串 )
方法3:自定义字段的clean方法转换空值
也可以给当前表单新增clean_maca方法,手动将空字符串转换为None再传递给模型层:
# 在你的Form类中添加以下代码 def clean_maca(self): maca_value = self.cleaned_data.get('maca') return maca_value if maca_value else None
内容的提问来源于stack exchange,提问作者maca
相关产品推荐
相关产品推荐

