Как итеративно отобразить первые X полей в форме Django
Я отображаю форму в html-шаблоне Django с помощью цикла for и итерации по полям. Я хочу добавить несколько разделов & заголовков внутри формы, поэтому есть ли способ "нарезать" поля формы или иным образом итеративно отобразить только часть полей?
Что-то вроде
{% for field in form.slice(0, 5) %}
<!-- render first 5 fields -->
<h2>Section 2</h2>
<p>Some text about next section</p>
{% for field in form.slice(5, 10) %}
<!-- render the next 5, etc. -->
Я знаю, что в худшем случае придется рендерить каждое поле вручную, но это ОЧЕНЬ длинная форма. Вот мой существующий код формы.
{% for field in form %}
<div class="field">
<label class="label" for="{{field.id_for_label}}">
{{field.label}}
</label>
<div class="control">{{field}}</div>
{% if field.help_text %}
<p class="help">{{field.help_text}}</p>
{% endif %}
<ul class="errorlist">
{% for error in field.errors %}
<li class="is-danger help">{{error}}</li>
{% endfor %}
</ul>
</div>
{% endfor %}
Вы можете использовать переменные Django forloop.counter0 или forloop.counter. Первая отслеживает итерации внутри цикла, начиная с индекса 0, а вторая индексирует итерации, начиная с 1 (подробнее см. в нижней части этого раздела https://docs.djangoproject.com/en/4.0/ref/templates/builtins/#for):
{% for field in form %}
{% if forloop.counter0 == 5 %}
<h2>Section 2</h2>
<p>Some text about section 2</p>
{% elif forloop.counter0 == 8 %}
<h2>Section 3</h2>
<p>Some text about section 3</p>
{% endif %}
<div class="field">
<label class="label" for="{{field.id_for_label}}">
{{field.label}}
</label>
<div class="control">{{field}}</div>
{% if field.help_text %}
<p class="help">{{field.help_text}}</p>
{% endif %}
<ul class="errorlist">
{% for error in field.errors %}
<li class="is-danger help">{{error}}</li>
{% endfor %}
</ul>
</div>
{% endfor %}
Вам все равно придется вручную проверять значения. Если вы хотите, например, добавить содержимое секции таким образом, чтобы можно было итерировать содержимое каждые 5 полей, вы можете воспользоваться divisibleby и Django-Mathfilters для разделения:
{% for field in form %}
{% if forloop.counter0|divisibleby:5 %}
<h2>Section {{ forloop.counter0|div:5}}</h2>
<p>Some text about section {{ forloop.counter0|div:5}}</p>
{% endif %}
<div class="field">
<label class="label" for="{{field.id_for_label}}">
{{field.label}}
</label>
<div class="control">{{field}}</div>
{% if field.help_text %}
<p class="help">{{field.help_text}}</p>
{% endif %}
<ul class="errorlist">
{% for error in field.errors %}
<li class="is-danger help">{{error}}</li>
{% endfor %}
</ul>
</div>
{% endfor %}
Для получения дополнительной информации вы можете посмотреть Модуль % в шаблоне Django, чтобы узнать о divisibleby и Есть ли фильтр для divide для шаблона Django? , чтобы получить некоторые другие методы о том, как делить числа в вашем шаблоне Django!