Django:用于循环迭代表单字段

时间:2013-10-01 18:52:51

标签: django forms loops field

我不想使用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 %}

4 个答案:

答案 0 :(得分:28)

这显然不起作用:

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

但这会:

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

答案 1 :(得分:4)

这个应该有效:

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

在表单中循环字段后,您无法访问form.field

答案 2 :(得分:1)

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

可见参数:

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

hiddens:

{% for hidden in form.hidden_fields %}
    {{ hidden }}
{% endfor %}
通过这种方式,您可以更好地控制UI元素。

答案 3 :(得分:0)

对于希望自定义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页面上。