You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Admin外键设null&blank=True,用formfield_for_foreignkey后变必填如何处理

问题根因

你手动实例化自定义的ParentLocaleChoiceField时,没有继承原模型字段的required配置,Django表单字段默认required=True,因此覆盖了模型层面null=True、blank=True对应的非必填属性。

解决方案

有两种常用实现方式,按需选择即可:

方式1:直接指定非必填属性

适合确定该字段永久为非必填的场景,直接在字段实例化时传入required=False:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'parent_locale':
        return ParentLocaleChoiceField(
            queryset=models.Locale.objects.all().order_by('display'),
            required=False
        )
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

方式2:继承模型原有配置(更推荐)

自动复用模型字段的blank属性映射表单的required状态,后续修改模型字段的必填规则时无需同步修改Admin代码:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'parent_locale':
        # 模型blank为True对应表单required为False
        kwargs["required"] = not db_field.blank
        kwargs["queryset"] = models.Locale.objects.all().order_by('display')
        return ParentLocaleChoiceField(**kwargs)
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

内容的提问来源于stack exchange,提问作者ndyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:39:00