【发布时间】:2009-04-09 11:54:03
【问题描述】:
我有一个 CheckboxSelectMultiple 字段,为什么我不能遍历单个选项?
这不起作用:
{%for choice in form.travels.choices%}
{{choice}}
{%endfor%}
即使指定 {{choice.0}} 也无济于事,我该怎么做?
谢谢
【问题讨论】:
标签: django django-forms
我有一个 CheckboxSelectMultiple 字段,为什么我不能遍历单个选项?
这不起作用:
{%for choice in form.travels.choices%}
{{choice}}
{%endfor%}
即使指定 {{choice.0}} 也无济于事,我该怎么做?
谢谢
【问题讨论】:
标签: django django-forms
在模板内部,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 和直接迭代方法很可能适合您。
【讨论】:
如果您有一个带有选择字段的 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
我希望这会有所帮助。
【讨论】:
如果您希望自定义字段的呈现,您可以使用文档中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 尝试过,它的工作方式相同。
【讨论】: