Перебирать варианты в CheckboxSelectMultiple - PullRequest
13 голосов
/ 09 апреля 2009

У меня есть поле CheckboxSelectMultiple, почему я не могу перебрать отдельные варианты?

Это не работает:

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

Даже указание {{choice.0}} не помогает, как я могу это сделать?

Спасибо

Ответы [ 2 ]

31 голосов
/ 09 апреля 2009

Внутри шаблона поле 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 и вполне может быть, что подход прямой итерации подходит для вас в этом случае.

0 голосов
/ 19 июля 2013

если у вас есть 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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...