Django: для заполнения полей формы ввода

Я не хочу использовать 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 %}

Ответ 1

Ну, это явно не сработало бы:

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

но это будет:

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

Ответ 2

Это должно работать:

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

Как только вы пройдете через поле в форме, вы не сможете получить доступ к form.field

Ответ 3

Лучший способ - использовать две петли, одну для скрытых полей и одну для видимых полей:

видимые объекты:

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

hiddens:

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

таким образом вы сможете лучше контролировать элементы пользовательского интерфейса.

Ответ 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>

Примечание: Конечно, вы захотите, чтобы это выглядело лучше, и, возможно, вы захотите просмотреть ошибки формы, если они есть.

У них также есть несколько очень полезных примеров на их странице PyPi.