【问题标题】:Iterate over choices in CheckboxSelectMultiple迭代 CheckboxSelectMultiple 中的选择
【发布时间】:2009-04-09 11:54:03
【问题描述】:

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

这不起作用:

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

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

谢谢

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    在模板内部,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.travels.field.widget.choices”。
    • 其次,对于自定义选择,如果您使用的是单选小部件,则需要根据字段值检查每个值,并在匹配时将输入设置为选中。例如:“{% if form.travels.value = choice_id %} checked="checked"{% endif %}”。
    【解决方案2】:

    如果您有一个带有选择字段的 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
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      如果您希望自定义字段的呈现,您可以使用文档中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 尝试过,它的工作方式相同。

      【讨论】:

        猜你喜欢
        • 2012-03-19
        • 2012-01-31
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        相关资源
        最近更新 更多