46

ChoiceFieldのラベルをどのように動作させますModelChoiceFieldか? を設定する方法empty_label、または少なくとも空白のフィールドを表示する方法はありますか?

Forms.py:

    thing = forms.ModelChoiceField(queryset=Thing.objects.all(), empty_label='Label')
    color = forms.ChoiceField(choices=COLORS)
    year = forms.ChoiceField(choices=YEAR_CHOICES)

ここで提案されている解決策を試しました:

Stack Overflow Q - 設定CHOICES = [('','All')] + CHOICESにより、内部サーバー エラーが発生しました。

スタック オーバーフロー Q2 - 私の選択で定義('', '---------'),した後、まだ選択ではなく、リストの最初の項目にデフォルト設定されてい('', '---------'),ます。

Gist - EmptyChoiceFielddefined here を使用してみましたが、Django 1.4 では機能しませんでした。

しかし、これらのどれも私にとってはうまくいきませんでした..この問題をどのように解決しますか? アイデアをありがとう!

4

8 に答える 8

56

ChoiceFieldに関する Django 1.11 のドキュメントを参照してください。ChoiceField の「空の値」は空の文字列として定義されているため、タプルのリストには、空の値として表示する値にマップされ''たキーが含まれている必要があります。''

### forms.py
from django.forms import Form, ChoiceField

CHOICE_LIST = [
    ('', '----'), # replace the value '----' with whatever you want, it won't matter
    (1, 'Rock'),
    (2, 'Hard Place')
]

class SomeForm (Form):

    some_choice = ChoiceField(choices=CHOICE_LIST, required=False)

を使用してフォームフィールドをオプションにしたい場合は、フォームエラーを回避できることに注意してください。required=False

また、空の値のない CHOICE_LIST が既にある場合は、それを挿入してフォームのドロップダウン メニューの最初に表示することができます。

CHOICE_LIST.insert(0, ('', '----'))
于 2013-01-26T23:58:34.483 に答える
22

私が使用したソリューションは次のとおりです。

from myapp.models import COLORS

COLORS_EMPTY = [('','---------')] + COLORS

class ColorBrowseForm(forms.Form):
    color = forms.ChoiceField(choices=COLORS_EMPTY, required=False, widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))
于 2013-08-08T22:10:02.060 に答える
5

これを試すことができます(選択がタプルであると仮定します):

blank_choice = (('', '---------'),)
...
color = forms.ChoiceField(choices=blank_choice + COLORS)
year = forms.ChoiceField(choices=blank_choice + YEAR_CHOICES)

また、これがフォームなのか ModelForm なのか、コードからはわかりませんが、後者です。ここでフォーム フィールドを再定義する必要はありません (choices=COLORS およびchoices=YEAR_CHOICES をモデル フィールドに直接含めることができます)。 .

お役に立てれば。

于 2013-01-26T22:48:08.777 に答える
2

パーティーに少し遅れて..

選択肢をまったく変更せず、ウィジェットで処理するだけではどうですか?

from django.db.models import BLANK_CHOICE_DASH

class EmptySelect(Select):
    empty_value = BLANK_CHOICE_DASH[0]
    empty_label = BLANK_CHOICE_DASH[1]

    @property
    def choices(self):
        yield (self.empty_value, self.empty_label,)
        for choice in self._choices:
            yield choice

    @choices.setter
    def choices(self, val):
        self._choices = val

次に、それを呼び出します:

class SomeForm(forms.Form):
    # thing = forms.ModelChoiceField(queryset=Thing.objects.all(), empty_label='Label')
    color = forms.ChoiceField(choices=COLORS, widget=EmptySelect)
    year = forms.ChoiceField(choices=YEAR_CHOICES, widget=EmptySelect)

当然、 はEmptySelectある種のcommon/widgets.pyコード内に配置され、必要なときにいつでも参照できます。

于 2018-09-07T11:52:37.523 に答える