【问题标题】:Django: For Loop to Iterate Form FieldsDjango:For循环迭代表单字段
【发布时间】:2013-10-08 01:22:34
【问题描述】:

我不想使用 django 的内置表单生成,试图在我的模板中指定每个字段以自定义 html 输出。

如何遍历一系列表单域?

如果我的表单如下所示:

class MyForm(forms.Form):
    main_image = forms.ImageField()
    second_image = forms.ImageField()
    third_image = forms.ImageField()
    fourth_image = forms.ImageField()
    ...

有没有办法编写一个{% for %} 循环以便我可以迭代:

{{ form.main_image }}
{{ form.second_image }}
{{ form.third_image }}
{{ form.fourth_image }}

我尝试了以下看起来合乎逻辑的方法,但没有奏效:

{% for field in form %}
  {{ form.field }}
{% endfor %}

【问题讨论】:

    标签: django forms loops field


    【解决方案1】:

    这显然行不通:

    {% for field in form %}
        {{ form.field }}
    {% endfor %}
    

    但这会:

    {% for field in form %}
        {{ field }}
    {% endfor %}
    

    【讨论】:

    • 非常真实!感谢您指出我的疏忽。将立即接受答案(+1)!
    • 如果我想排除第一个字段而只显示最后一个字段怎么办?
    • @NickB 肮脏的方式:{% if forloop.counter != 1 %},但我认为你最好通过排除表单定义中的字段..
    【解决方案2】:

    最好的方法是使用两个循环,一个用于隐藏字段,一个用于可见字段:

    可见:

    {% for field in form.visible_fields %}
        {{ field.label }}
        {{ field }}
    {% endfor %}
    

    隐藏:

    {% for hidden in form.hidden_fields %}
        {{ hidden }}
    {% endfor %}
    

    通过这种方式,您可以更好地控制 UI 元素。

    【讨论】:

      【解决方案3】:

      这个应该可以:

      {% for field in form %}
        {{ field }}
      {% endfor %}
      

      一旦您遍历 form 中的字段,您将无法访问 form.field

      【讨论】:

      • 好的,谢谢!但我很抱歉@mariodev 先回答了这个问题。但是请 +1 表示感谢!
      • 我不在乎功劳,我很高兴你克服了这个问题 :)
      • 哈哈,谢谢!关于如何排除第一个字段并仅显示其余字段的任何想法?
      • 我会给你一个线索:这都是关于流量控制的
      【解决方案4】:

      对于任何希望自定义 Django 表单的前端开发人员,您可以使用名为 django-widget-tweaks 的包来单独呈现字段。示例代码如下:

      {# Your template with the form #}
      {% extends "base.html" %}
      {% load widget_tweaks %}
      
      <form action="" method="POST">
          {% csrf_token %}
      
          {% for field in form %}
              <label for="{{ field.id_for_label }}">
                {{ field.label }}{% if field.field.required %}*{% endif %}
              </label>
              {% render_field field %}
          {% endfor %}
      
          <button type="button">
              Submit Form
          </button>
      </form>
      

      注意:您当然想让它看起来更漂亮,如果有任何错误,您可能希望循环查看表单错误。

      They have some very useful examples 也在他们的 PyPi 页面上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 2019-05-04
        • 1970-01-01
        相关资源
        最近更新 更多