迭代CheckboxSelectMultiple中的选项

时间:2009-04-09 11:54:04

标签: django django-forms

我有一个CheckboxSelectMultiple字段,为什么我不能迭代单个选项?

这不起作用:

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

即使指定{{choice.0}}也无济于事,我该怎么做?

由于

3 个答案:

答案 0 :(得分:31)

在模板内部,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。您可能会发现使用自定义表单字段或自定义模板标记可以为您提供更便携,可重复使用的实现,从而更好地维护django在视图代码和模板代码之间的预期分离。当然,在这种情况下,YMMV很可能是直接迭代方法适合你。

答案 1 :(得分: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

我希望这会有所帮助。

答案 2 :(得分:0)

如果您希望自定义字段的呈现,您可以使用文档中 RadioSelect widget 部分概述的相同技术。

以下内容直接来自文档。您有一个带有 myform 字段 RadioSelect 的表单 beatles。您可以像这样访问不同的元素:

<fieldset>
    <legend>{{ myform.beatles.label }}</legend>
    {% for radio in myform.beatles %}
    <label for="{{ radio.id_for_label }}">
        {{ radio.choice_label }}
        <span class="radio">{{ radio.tag }}</span>
    </label>
    {% endfor %}
</fieldset>

我刚刚用 CheckboxSelectMultiple 尝试过,它的工作方式相同。