【问题标题】:Django: model field having blank=True, null=True, unique=True gives troubles in the adminDjango:具有blank=True,null=True,unique=True的模型字段在管理员中带来麻烦
【发布时间】:2023-03-12 00:55:01
【问题描述】:

我有一个模型:

ipv4_address = models.IPAddressField(verbose_name=_('ipv4 address'), blank=True, null=True, unique=True, default=None)
ipv6_address = models.GenericIPAddressField(protocol='IPv6', verbose_name=_('ipv6 address'), blank=True, null=True, unique=True, default=None)

给我这里描述的麻烦:https://code.djangoproject.com/ticket/4136

我该如何解决这个问题?

我正在考虑制作一个自定义的 GenericIPAddressField,它将 NULL 插入数据库而不是空字符串。你怎么看?还有其他可能的解决方案吗?

【问题讨论】:

  • 您是否尝试覆盖模型的保存方法并将空字符串替换为 None 那里?
  • 试过这个但没有用。无论如何我都会收到验证错误。

标签: django django-models django-admin


【解决方案1】:

您对自定义字段GenericIPAddressField 的建议可能是最干燥的解决方案。 akonsu 在上面的 cmets 中建议覆盖 save 方法是一个很好的建议。我使用的一个快速技巧是将模型表单中的值清除为 None。

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def clean_ipv6_address(self):
        """
        Return None instead of empty string
        """
        return self.cleaned_data.get('ipv6_address') or None

如果您通过 django 管理员编辑模型,请在此处使用您的模型表单

#!admin.py
class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm

admin.site.register(MyModel, MyModelAdmin)

【讨论】:

  • 试过了,谢谢!必须为 inline_formset 做类似的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2015-08-11
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多