Django FloatField设blank=True/null=True仍必填,删除字段后仍报错
解决Django Admin中FloatField设置blank=True/null=True仍必填的问题
嘿,这个问题我之前帮朋友排查过好几次,大概率是这几个地方出了问题,咱们一步步来拆解:
先检查ModelAdmin的配置细节
别只盯着模型里的字段设置,Django Admin有时候会“自作主张”强制字段必填。打开你的admin.py,找到对应模型的ModelAdmin类:- 如果用了
fields或者fieldsets,确认additional_salary有没有被包含在里面,但没在表单层面允许为空。要是用了自定义ModelForm,得确保表单里的这个字段明确设置了required=False。 - 举个反面例子,要是你这么写:
哪怕模型里设了class YourModelAdmin(admin.ModelAdmin): fields = ['name', 'additional_salary']blank=True,Admin表单还是会默认要求必填。这时候要么把这个字段从fields里移除(如果不需要在Admin展示),要么自定义表单修正:from django import forms from .models import YourModel class YourModelForm(forms.ModelForm): additional_salary = forms.FloatField(required=False) class Meta: model = YourModel fields = '__all__' class YourModelAdmin(admin.ModelAdmin): form = YourModelForm
- 如果用了
确认迁移真的生效到数据库了
有时候执行migrate看起来没报错,但数据库里的字段其实没改成允许NULL。你可以直接查数据库表结构验证:- MySQL用
DESCRIBE your_table_name;,PostgreSQL用SELECT column_name, is_nullable FROM information_schema.columns WHERE table_name = 'your_table_name'; - 如果
additional_salary的is_nullable还是NO,说明迁移没真正生效。试试删除对应这个字段的迁移文件(在migrations文件夹找最近的那个),然后重新跑python manage.py makemigrations和python manage.py migrate。
- MySQL用
清掉各种缓存(删除字段后仍报错的核心原因)
你说删除字段后还触发报错,这十有八九是缓存搞的鬼:- 先强制刷新浏览器(Ctrl+Shift+R),把旧的表单缓存清掉;
- 如果你的Django项目用了缓存框架(比如Redis、Memcached),跑一下
python manage.py clearcache清空Django的后台缓存; - 另外,gunicorn虽然重启了,但有时候worker进程没完全杀掉,试试彻底停止gunicorn再重启,比如用
pkill gunicorn再重新启动服务。
检查模型的自定义校验逻辑
比如模型的clean()方法里有没有强制要求additional_salary必须有值?或者信号(signal)里做了额外校验?这些都会绕过Admin的设置导致报错。打开模型文件看看有没有类似代码:def clean(self): super().clean() if self.additional_salary is None: raise ValidationError("additional_salary不能为空")如果有的话,把这段逻辑去掉或者修改成允许为空的规则。
按照这几步排查下来,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Sam B.
相关产品推荐
相关产品推荐

