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
相关产品推荐
相关产品推荐

