Django IntegerChoices字段提交空值报Field 'maca2' expected a number错误如何解决
问题排查与解决方案
报错根因
你遇到的报错是两个问题共同导致的:
- 代码缩进错误:
maca2字段现在被定义在Maca2内部类的作用域内,不属于Maca模型的字段,Django无法正确识别该字段的类型和choices规则,导致表单提交的空选项值没有被正常转换 - 表单空选项value异常:正常
IntegerChoices的__empty__配置只会设置下拉框的显示文本,空选项的value应为空字符串,你当前提交到后端的值是Select字符串,说明表单配置也存在问题
修复步骤
1. 修正模型缩进和语法
调整maca2字段的缩进层级,和Maca2内部类平级,同时移除choices定义末尾多余的逗号,修正后代码如下:
from django.db import models from django.utils.translation import gettext_lazy as _ class Maca(models.Model): class Maca2(models.IntegerChoices): Personal = 1 Work = 2 Transport = 3 __empty__ = _('Select') # 字段属于Maca模型,和内部类平级 maca2 = models.PositiveSmallIntegerField( db_column='Maca2', choices=Maca2.choices, null=True, blank=True )
2. 校验表单配置
- 如果你用的是
ModelForm,不需要手动配置maca2字段的choices,Django会自动生成空选项value为空字符串的下拉框,提交时会自动把空字符串转换为None存入字段 - 如果你是手动写的HTML表单,确保空选项的value属性为空,正确写法:
不要把value写成<option value="">Select</option>Select。
3. 同步模型到数据库
删除之前错误缩进时生成的Maca模型迁移文件(不要删除迁移目录下的__init__.py),重新执行迁移命令:
python manage.py makemigrations python manage.py migrate
如果已经有生产环境的迁移记录被应用,需要先回退对应迁移版本再做修改。
修复完成后再提交空值就不会再触发类型错误。
内容的提问来源于stack exchange,提问作者maca
相关产品推荐
相关产品推荐

