15

CheckboxSelectMultipleフィールドがありますが、単一の選択肢を反復処理できないのはなぜですか?

これは機能しません:

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

指定{{choice.0}}しても役に立ちませんが、どうすればこれを行うことができますか?

ありがとう

4

3 に答える 3

34

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

タプルとして選択を繰り返すには:

{% 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とは、この場合、直接反復アプローチが適切である可能性があります。

于 2009-04-09T12:35:40.053 に答える
0

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

フォーム.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

これが役立つことを願っています。

于 2013-07-19T09:14:00.820 に答える