2009-04-17 87 views
51

私はChoiceFieldを持っていますが、今私はそれを必要とするときに "ラベル"をどうやって取得しますか?Djangoフォームで選択肢のラベルを取得する方法ChoiceField?

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

form.cleaned_data["reason"]は、私に「機能」または「注文」程度しか与えません。

+1

あなたはどの答えが受け入れられたものか再考する必要があると思います。 –

+0

@ダン:なぜですか?あなたはどちらを好みますか? – webjunkie

+0

@webjunkie投票数が最も多いのは、モデルごとに書かれるコードが少なくて済むジャンゴ中心のものです。 –

答えて

57

をするでしょう:

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

これは私が思いついた方法です。簡単な方法があるかもしれません。私は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 

注:これは、おそらく非常にPython的ではありませんが、必要なデータを見つけることができる場所、それが証明しています。

+0

この種のものが今やコアの一部であるかどうかについての言葉はありますか?これはフォームAPIに含まれていないことは間違いないが、私はより良い解決策を求めるのに苦労している。 –

103

Model.get_FOO_display()のドキュメントを参照してください。このように使用、テンプレートで

ContactForm.get_reason_display() 

{{ OBJNAME.get_FIELDNAME_display }} 
+29

しかし、それはモデルではなく、フォームです。 – webjunkie

+1

これはDjangoモデルにのみ当てはまります。フォームはこの動作をエミュレートしません(今は私が望んでいましたが)... –

+0

これはモデルに最適です。ヒントありがとうございます。私はまだフォームのために別々に行う必要があると思います。 – garromark

0

私は多分@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() 
15

これこれを行うための最も簡単な方法:Model instance reference: Model.get_FOO_display()

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

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

+3

* NB *あなたの答え(3)に「モデル」とあなたが質問した回数(0)@webjunkieがそれを言いました回数。 – supervacuo

+0

'selected_label = form.instance.get_FOO_display()'が1つ働いています –

6

フォームインスタンスがバインドされている場合は、あなたが

chosen_label = form.instance.get_FOO_display() 
+0

これはModelFormでのみ機能しますが、その質問には言及していません。 – Tuttle

2

を使用することができます。このようなあなたのフォームを持つことができます。

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