2009-04-09 17 views
11

CheckboxSelectMultipleフィールドがありますが、1つの選択肢を反復処理できないのはなぜですか?CheckboxSelectMultipleの選択肢を繰り返します。

これは動作しません:

{%for choice in form.travels.choices%} 
    {{choice}} 
    {%endfor%} 

でも助けにはならない{{choice.0}}を指定して、私はこれを行うことができますどのように?

おかげ鋳型内部

答えて

29

travelsフィールドとして実際に(フィールドレンダリングのためにその値を一緒に結合するDjangoのオブジェクトである)BoundFieldのインスタンス。これは、プロパティが多少異なることを意味します。

{% for choice in form.travels.field.choices %} 
    {{ choice }} - 
{% endfor %} 

Produces: (1, 'One') - (2, 'Two') - 

を個別に選択タプルの要素を反復処理するには:タプルとしての選択肢を反復するために

{% for choice_id, choice_label in form.travels.field.choices %} 
    {{ choice_id }} = {{ choice_label }} <br/> 
{% endfor %} 

Produces: 1 = One 
      2 = Two 

お役に立てば幸いです。しかし、それを言って、私はあなたがこれを行う必要がある文脈の確信していません。表面には、それは非常にdjangoのように見えません。カスタムフォームフィールドまたはカスタムテンプレートタグを使用すると、ビューコードとテンプレートコードの間の意図的な分離をよりよく維持する移植性と再利用可能な実装が得られることがあります。もちろん、YMMVであり、この場合は、直接反復のアプローチが適切である可能性があります。

+3

私はこれが古いと知っていますが、フィールドが選択されているかどうかを判断する方法はありますか? –

+0

最初に、カスタムウィジェットを使用するときは、フィールドオプションとウィジェットオプションが同じでない場合があるので注意してください。したがって、 "form.travels.field.widget.choices"を使用する必要があります。 –

+0

第2に、ラジオウィジェットを使用している場合のカスタム選択では、各値をフィールド値と照合し、一致するときに入力をチェックするように設定する必要があります。例: "{%if form.travels.value = choice_id%} checked ="チェック "{%endif%}" –

0

選択フィールドを持つForm.ModelFormがある場合は、単純なテンプレートフィルタを使用してそれをテンプレートで評価できます。

forms.py

STATE_CHOICES = (
    (10, 'NO'), 
    (4, 'YES'), 
    (18, 'Send to another Chemist for Review'), 
    (34, 'Send to another Market Expert for Review'), 
    (20, 'HOLD'), 
) 
new_state = forms.ChoiceField(
    choices=STATE_CHOICES, 
    required=True, 
) 

テンプレート:

{{ business_manager_form.new_state|filter_project_states:project }} 

、ここでは、フィルタそれが自己です。

@register.filter() 
def filter_project_states(argv, project): 
if project.department.id != 4: 
argv.field.choices = [choice for choice in argv.field.choices if choice[0] != 34] 
return argv 

これが役立ちます。

関連する問題