2012-01-10 75 views
22

我創造了它與外鍵的模式:Django,如何從modelform中的choicefield中刪除空白選項?

class Book(models.Model): 
    library = models.ForeignKey(Library, null=False, blank=False) 
    ... 

,然後我創建了一個表格一個的ModelForm顯示給用戶:

class BookSubmitForm(ModelForm): 
    class Meta: 
     model = Book 

,當我與顯示頁面形式我得到的庫選擇,但也是默認來的空白(--------)的選擇。

我認爲通過在模型中使用null = False和blank = False可以擺脫ModelForm中的空白選擇,但不會。我能做些什麼才能在列表中有實際的選擇,而不是那個?

回答

26

參見ModelChoiceField。你必須將empty_label設置爲None。所以,你的代碼將是這樣的:

class BookSubmitForm(ModelForm): 
    library = ModelChoiceField(queryset=Library.objects, empty_label=None) 

    class Meta: 
     model = Book  

編輯:如果指定型號字段定義blank=Falsedefault=<VALUE>然後Django會不會默認呈現空白選擇改變的字段名小寫

+0

它有點工作,但我還是看到原來ChoiceField形式與空白選擇旁邊的新與同標號和同樣的選擇,但沒有空白選擇。看起來這種方法並不是重寫表單,而是用相同的字段擴展它。 – Bastian 2012-01-10 09:32:28

+0

好吧,我的不好,這是一個錯字,我用了一個大寫的第一個字母,就像你的例子中的「庫」一樣。切換到小寫「庫」時,它實際上會覆蓋該字段。謝謝! – Bastian 2012-01-10 10:01:39

+0

太棒了!如果你不打算改變查詢集,你也可以簡單地使用'self.fields ['library']。empty_label = None'。 – guival 2017-12-14 11:44:45

6

;請注意,默認值可能是無效選項,例如設置爲''或任何invalid choice

class Book(models.Model): 
    library = models.ForeignKey(Library, null=False, blank=False, default='') 
    ... 
+0

僅僅爲了適應窗體而改變模型看起來不正確。這應該只有在你的模型對這種行爲有意義時才能完成。 – guival 2017-12-14 11:42:16

7

如果你使用的ModelForm,那麼你不必指定查詢集,要求,標籤等,但對於upvoted回答你必須再做一次。

其實你可以做到這一點,以避免重新指定一切

class BookSubmitForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(BookSubmitForm, self).__init__(*args, **kwargs) 
     self.fields['library'].empty_label = None 

    class Meta: 
     model = Book 
+0

不知何故,這不適合我。如果像上面那樣設置empty_label = None,我仍然可以看到「---------」作爲選項之一。這對Django 1.10仍然有效嗎? – Anupam 2017-06-07 09:31:54

+0

其實,我覺得這是一個TypedChoiceField,因此@Mithril的答案如下。 – Anupam 2017-06-07 10:23:29

8

self.fields['xxx'].empty_label = None不會工作如果字段類型爲TypedChoiceField不具有empty_label財產。 我們應該做的是去除的第一選擇:

class BookSubmitForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(BookSubmitForm, self).__init__(*args, **kwargs) 

     for field_name in self.fields: 
      field = self.fields.get(field_name) 
      if field and isinstance(field , forms.TypedChoiceField): 
       field.choices = field.choices[1:]