2010-03-22 25 views
15

Modellerimden birinin basitleştirilmiş bir sürümü:Neden django admin NULL olabilecek yabancı anahtarları kabul etmiyor?

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) 

Bu sınıf, bir feed'in öğelerinin listesini veritabanına içe aktarma kuralını yönetir.

Yönetici sistemi, modelde null olarak bildirilmesine rağmen bir feed_provider_category seçmeden bir ImportRule eklememe izin vermez. Veritabanını (şu anda SQLite) bile kontrol eder:

>>> .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 kabuğundaki nesneyi kolayca oluşturabilirim:

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

... ama yönetici sistem izin vermiyor tabi ki onu düzenleyeyim. Bu yabancı anahtarı belirtmeden nesneleri düzenlememe/oluşturma izni vermek için yöneticiye nasıl ulaşabilirim?

cevap

32

blank = True?

alan boş değerin girişini sağlayacak Django'nın yönetici sitesinde boş = Doğru, doğrulama varsa: Django's docs itibaren. Bir alan boşsa = Yanlış ise, alan gerekli olacaktır.

+2

. Null = True, CharField olmasaydı yeterli olurdu ve bu boş = True CharField'a özgüydi. Yanılıyormuşum gibi görünüyor. –

+1

Bu beni merak etti, neden Django'nun yöneticisi boş değerlere boş değerlere otomatik olarak izin vermiyor? = Boş alanları açıkça ayarlamadan True = True? Çok fazla büyü mü? – jholster

+4

'null = True' model (veritabanı) için çalışıyor, boş ise" True "biçimindedir. Formlar için başka bir seçenek daha var: 'düzenlenebilir = Yanlış ' – jpaugh

2

... Tamam, bunu kendi başıma nasıl yapacağımı öğrendim. Bu en iyi yol olmayabilir, ama modeli doğrulamak için özel bir formu oluşturuldu:

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

Ve Yönetici sınıfın içine bağlantılı:

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

Bu çalışma dışarı bir sürü aldı ve çok fazla gereksiz rahatsızlık, yani başka biri daha iyi bir çözüme sahipse, o zaman bana vermeme izin verdiler/kabul ettiler/alsınlar :)

5

Sen bunun gibi, null adlı = Gerçek eklemeye çalışmalıdır: çalışmıştır

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