2011-01-14 16 views
18

ben "-------------" seçim Django kurtulmak istiyorum boş seçim çıkarmadan O varModelChoiceField,

bir ModelForm bir yabancı anahtarı temsil eden seçkin bir giriş ekler been answered, empty_label=none seçeneğini kullanabilirsiniz, ancak bir ModelForm var, düzenli bir form değil ve alanın geçersiz kılınmasına izin verilmiyor.

ben

self.fields['my_foreign_key'].queryset = .... 

kullanarak ModelChoiceField en Sorgu Kümesi değiştirmek için ModelForm arasında __init__() yöntemini geçersiz biliyoruz Ama bu "Ana" ile ilgili 10 üzerinde foreign_keys olduğu gibi bu, gerçekten çirkin olurdu Model ve bu modelde

bir Modelform orada daha fazla temel alan bütün içeriği: aynı bu foreign_key noktaları

  • her biri türden modeller: seçimlerin belirli listeleri, yönetici tarafından değişikliklerini kolaylaştırmak için birçok model.
  • Tüm bu modeller, üç harfli bir kod içeren bir Charfield'ı temel alan bir "to_field = code" ilişkisi aracılığıyla Ana modelle ilgilidir (hey, benim hatam değil, eski bir MS Access DB kullanmak zorundaydım), Bu Charfield blank=True, unique=True seçenek vardır, bu yüzden, her liste için durum şimdi bahis vardır bir "---No information yet---" kaydını yerine üç harfli kod boş bir değer ...

oluşturabilirsiniz: Ben olsun iki "boş değer" seçimli bir giriş alanı: django bir ve benim, diğeri birbiri ardına. Eğer böyle bir şey yapabildiği ModelChoiceField için boş seçim kaldırmak isterseniz Sadece

+0

Sana/yeniden tanımlamak alanını üzerine yazabilirsiniz düşünüyorum. Bunu bir DateTime model alanını TimeField biçimlerine dönüştürmek için yapıyorum (ve DateField öğesinin fazladan bir alanını ekleyin). Sonra tarih ve saat alanlarını birleştirmek için formun clean() yöntemini geçersiz kıldım. –

cevap

27

... burada da bir 'empty_label = none` seçeneği özledim ..

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

    def __init__(self, *args, **kwargs): 
     super(Form, self).__init__(*args, **kwargs) 
     modelchoicefields = [field for field_name, field in self.fields.iteritems() if 
      isinstance(field, forms.ModelChoiceField)] 

     for field in modelchoicefield: 
      field.empty_label = None 

Ama hepsi yerini alacak ModelChoiceField s, gibi pek belki bir şey daha ince taneli: __init__ daha Kesinlikle daha kolay

for fieldname in ('field1','field2','field3','field4','field5','field6'): 
    self.fields[fieldname].empty_label = None 

Bahsettiğiniz üzerine yazma! Sen 2017+ kullanımını kullanabilirsiniz Moritz

den

Güncelleme:

forms.ModelChoiceField(... empty_label=None 

+0

Bu harika Yuji çalışıyor, UP okuna on kez tıklayabilseydim. ModelForms çok kapalı değil Ben tüm –

+0

Ehehe sonra düşündüm, güzel! : D –

+0

Şimdi aşağıdakileri yapabilirsiniz: '' 'forms.ModelChoiceField (... empty_label = None)' '' – Moritz