【问题标题】:Why is django admin not accepting Nullable foreign keys?为什么 django admin 不接受 Nullable 外键?
【发布时间】:2011-01-30 09:40:47
【问题描述】:

这是我的一个模型的简化版本:

class ImportRule(models.Model):
  feed = models.ForeignKey(Feed)
  name = models.CharField(max_length=255)
  feed_provider_category = models.ForeignKey(FeedProviderCategory, null=True)
  target_subcategories = models.ManyToManyField(Subcategory)

此类管理用于将项目列表从提要导入数据库的规则。

管理系统不允许我在未选择 feed_provider_category 的情况下添加 ImportRule,尽管它在模型中被声明为可为空。数据库(目前是 SQLite)甚至可以正常检查:

>>> .schema
...
CREATE TABLE "someapp_importrule" (
  "id" integer NOT NULL PRIMARY KEY,
  "feed_id" integer NOT NULL REFERENCES "someapp_feed" ("id"),
  "name" varchar(255) NOT NULL,
  "feed_provider_category_id" integer REFERENCES "someapp_feedprovidercategory" ("id"),
);
...

我可以很容易地在 python shell 中创建对象:

f = Feed.objects.get(pk=1)
i = ImportRule(name='test', feed=f)
i.save()

...但是管理系统当然不允许我编辑它。 如何让管理员在不指定外键的情况下让我编辑/创建对象?

【问题讨论】:

    标签: django-admin foreign-keys nullable


    【解决方案1】:

    blank=True怎么样?来自Django's docs

    如果True,该字段允许为空。默认为False

    【讨论】:

    • 那行得通。我在想 null=True 如果它不是 CharField 就足够了,而 blank=True 是 CharField 特定的。看来我错了。
    • 这让我想知道,为什么 Django 的管理员不自动允许 null=True 字段的空白值而不明确设置空白=True?魔法太多了?
    • null=True 适用于模型(数据库),而blank=True 适用于表单。表格还有另一种选择:editable=False
    【解决方案2】:

    您应该尝试添加 null=True,就像这样:

    car = models.ForeignKey(Car, default=None, null=True, blank=True)
    

    【讨论】:

      【解决方案3】:

      ...好吧,我自己发现了如何做到这一点。这可能不是最好的方法,但我创建了一个自定义表单来验证模型:

      class AdminImportRuleForm(forms.ModelForm):
        class Meta:
          model = ImportRule
        name = forms.CharField(max_length=255)
        feed = forms.ModelChoiceField(required=True, queryset=Feed.objects.all())
        feed_provider_category = forms.ModelChoiceField(required=False, queryset=FeedProviderCategory.objects.all())
        target_subcategories = forms.ModelMultipleChoiceField(queryset=Subcategory.objects.all())
      

      我将它链接到 Admin 类:

      class ImportRuleAdmin(admin.ModelAdmin):
        form = AdminImportRuleForm
        ...
      

      这需要大量的工作和很多不必要的麻烦,所以如果其他人有更好的解决方案,他们会得到投票/接受/无论它会让我给出什么:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-20
        • 2016-11-06
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2015-05-04
        • 2012-07-27
        相关资源
        最近更新 更多