2011-01-14 198 views
18

我想擺脫Django在ModelForm上代表外鍵的選擇輸入中添加的「-------------」選項ModelChoiceField,刪除空白選項

它是been answered您可以使用empty_label=none選項,但我有一個ModelForm,而不是一個常規窗體,並且不允許覆蓋該字段。

我知道我可以覆蓋的ModelForm的__init__()方法,以便使用

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

修改ModelChoiceField的查詢集但這將是非常難看,因爲這發生在「主」了+10 foreign_keys模型,並有超過的ModelForm更多基於此模型

整個背景:

  • 這些foreign_key點之一相同的一種模型:它們是特定的選擇列表,許多模型通過管理員來簡化它們的修改。
  • 所有這些模型都通過一個「to_field = code」關係與主模型相關,基於一個包含三字母代碼的Charfield(嘿,不是我的錯,我不得不使用傳統的MS Access DB),這CharField有blank=True, unique=True選項,這樣我就可以,每個列表,創建一個"---No information yet---"紀錄而言,你打賭,一個空值,而不是三個字母代碼...

目前情況:我得到一個有兩個「空白值」選擇的選擇輸入字段:django和我的一個接一個。 我只是錯過了「empty_label = none`選擇在這裏太...

+0

我想你可以重新定義/覆蓋的領域。我這樣做將DateTime模型字段更改爲表單TimeField(並添加DateField的額外字段)。然後我重寫表單的clean()方法來組合日期和時間字段。 – 2011-01-15 08:07:20

回答

27

如果要刪除空白的選擇。所有ModelChoiceField你可以做這樣的事情..

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 

但是,這將取代所有ModelChoiceField S,所以也可以是更細粒度的,如:

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

肯定比__init__容易覆蓋您提到!

從莫里茨

您可以使用2017+使用

更新:

forms.ModelChoiceField(... empty_label=None 

+0

這是很好的Yuji,希望我可以在UP箭頭上點擊十次。 ModelForms並非如此封閉我認爲畢竟 – 2011-01-14 20:38:56