2012-01-10 119 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 

と私はページを表示私はライブラリの選択だけでなく、デフォルトで空白(--------)の選択肢を得る。

ModelFormではその空白の選択肢を取り除くモデルではnull = False、空白= Falseにすると考えましたが、リストに実際の選択肢しか持たず、その選択肢を持たないためには何ができますか?

答えて

26

ModelChoiceFieldを参照してください。 empty_labelをNoneに設定する必要があります。

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

    class Meta: 
     model = Book  

EDIT:だからあなたのコードは次のようになりますあなたはモデルフィールドの定義にblank=Falsedefault=<VALUE>を指定すると、Djangoはデフォルトで空白の選択肢をレンダリングしません小文字の

+0

が、私はまだ同じラベルを持つ新しいものと同じ選択肢と並んでますが、空白なしで空白を選択して、フォームの元ChoiceFieldを参照してください。 我々は何をすべきことは、最初の選択肢を削除することです選択。このメソッドはフォームをオーバーライドするのではなく、同じフィールドで展開しているようです。 – Bastian

+0

私の悪い、それはタイプミスだった、私はあなたの例 "ライブラリ"のような大文字の最初の文字を使用しました。小文字の "ライブラリ"に切り替えると、実際にフィールドが上書きされます。ありがとう! – Bastian

+0

素晴らしい!クエリーセットを変更しない場合は、単純に 'self.fields ['library']。empty_label = None'とすることもできます。 – guival

6

にフィールド名を変更し、デフォルト値は無効な選択肢であり、たとえば''または任意のinvalid choiceに設定されていることに注意してください。あなたはのModelFormを使用している場合

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

フォームに合わせるだけでモデルを変更するのは正しいとは言えません。これは、モデルがこのように動作することが理にかなっている場合にのみ行う必要があります。 – guival

7

は、あなたは、必要に応じ、ラベルなどをクエリセットを指定する必要はありません。しかしupvoted答えのために、あなたは再びそれをしなければなりません。

実際にあなたがフィールドの型がempty_label性質を持っていないTypedChoiceFieldある場合

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

何とかこれは私のために働くdoesnt。上記のようにempty_label = Noneと設定した場合、私は引き続きオプションの1つとして "---------"を参照します。これはDjango 1.10でも有効ですか? – Anupam

+0

実際、私はTypedChoiceFieldであると考えていたので、以下のように@ Mithrilの答えが働いていました。 – Anupam

8

self.fields['xxx'].empty_label = None再指定すべてが動作しません避けるために、これを行うことができます。それは一種の作品

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:] 
関連する問題