web-dev-qa-db-ja.com

Django forms ChoiceField?で選択肢のラベルを取得する方法は?

ChoiceFieldがありますが、必要なときに「ラベル」を取得する方法を教えてください。

class ContactForm(forms.Form):
     reason = forms.ChoiceField(choices=[("feature", "A feature"),
                                         ("order", "An order")],
                                widget=forms.RadioSelect)

form.cleaned_data["reason"]は、「機能」または「注文」などしか表示しません。

59
webjunkie

これは役立つかもしれません:

reason = form.cleaned_data['reason']
reason = dict(form.fields['reason'].choices)[reason]

Model.get_FOO_display() のドキュメントを参照してください。だから、次のようなものでなければなりません:

ContactForm.get_reason_display()

テンプレートでは、次のように使用します。

{{ OBJNAME.get_FIELDNAME_display }}
116
shacker

これを行う最も簡単な方法: モデルインスタンスリファレンス:Model.get_FOO_display()

表示名を返すこの関数を使用できます:ObjectName.get_FieldName_display()

ObjectNameをクラス名に、FieldNameを表示名を取得する必要があるフィールドに置き換えます。

19
Kumar

フォームインスタンスがバインドされている場合、使用できます

chosen_label = form.instance.get_FOO_display()
6
krubo

ここに私が思いついた方法があります。もっと簡単な方法があるかもしれません。 python manage.py Shellを使用してテストしました:

>>> cf = ContactForm({'reason': 'feature'})
>>> cf.is_valid()
True
>>> cf.fields['reason'].choices
[('feature', 'A feature')]
>>> for val in cf.fields['reason'].choices:
...     if val[0] == cf.cleaned_data['reason']:
...             print val[1]
...             break
...
A feature

注:これはおそらく非常にPythonicではありませんが、必要なデータがどこにあるかを示しています。

4
Ryan Duffield

次のようなフォームを作成できます。

#forms.py
CHOICES = [('feature', "A feature"), (order", "An order")]
class ContactForm(forms.Form):
     reason = forms.ChoiceField(choices=CHOICES,
                                widget=forms.RadioSelect)

次に、これはあなたが望むものを与えるでしょう:

reason = dict(CHOICES)[form.cleaned_data["reason"]]
2
Akshar Raaj

@AndrésTorresMarroquínを使用していて、実装を共有したいと思います。

GOOD_CATEGORY_CHOICES = (
    ('paper', 'this is paper'),
    ('glass', 'this is glass'),
    ...
)

class Good(models.Model):
    ...
    good_category = models.CharField(max_length=255, null=True, blank=False)
    ....

class GoodForm(ModelForm):
    class Meta:
        model = Good
        ...

    good_category = forms.ChoiceField(required=True, choices=GOOD_CATEGORY_CHOICES)
    ...


    def clean_good_category(self):
        value = self.cleaned_data.get('good_category')

        return dict(self.fields['good_category'].choices)[value]

結果はthis is paperの代わりにpaper。この助けを願っています

0
Ardi Nusawan

@webjunkieが正しいと思います。

POSTからフォームを読んでいる場合は、

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            contact = form.save()
            contact.reason = form.cleaned_data['reason']
            contact.save()
0
Noel Evans