Почему администратор django не принимает внешние ключи Nullable? - PullRequest
16 голосов
/ 22 марта 2010

Вот упрощенная версия одной из моих моделей:

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)

Этот класс управляет правилом импорта списка элементов из канала в базу данных.

Система администраторане позволит мне добавить ImportRule без выбора feed_provider_category, несмотря на то, что он объявлен в модели как nullable.База данных (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 достаточно легко:

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

... но система администраторане позволю мне редактировать это, конечно.Как я могу заставить администратора разрешить мне редактировать / создавать объекты без указания этого внешнего ключа?

Ответы [ 3 ]

37 голосов
/ 22 марта 2010

Как насчет blank=True? Из Документов Джанго :

Если True, поле может быть пустым. По умолчанию False.

5 голосов
/ 09 марта 2011

Вы должны попробовать добавить null = True, как этот:

car = models.ForeignKey(Car, default=None, null=True, blank=True)
2 голосов
/ 22 марта 2010

... хорошо, я узнал, как это сделать самостоятельно.Возможно, это не лучший способ, но я создал специальную форму для проверки модели:

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())

И я связал ее с классом администратора:

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

Это заняло много времениразработки и множества ненужных хлопот, поэтому, если у кого-то еще есть лучшее решение, он получает голоса / принимает / все, что он мне даст:)

...