20

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

4 回答 4

46

好吧,这显然行不通:

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

但这将:

{% for field in form %}
    {{ field }}
{% endfor %}
于 2013-10-01T18:58:02.530 回答
13

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

可见:

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

隐藏:

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

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

于 2017-10-07T18:22:58.307 回答
7

这个应该工作:

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

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

于 2013-10-01T19:01:05.523 回答
3

对于任何希望自定义 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>

注意:你当然想让它看起来更好看,如果有任何错误,你可能想循环遍历你的表单错误。

他们的 PyPi 页面上也有一些非常有用的示例

于 2019-08-23T16:46:35.500 回答