如何迭代呈现 Django 表单中的第一个 X 字段

How to iteratively render the first X fields in a Django form

我在 Django html 模板中通过使用 for 循环并遍历字段来呈现表单。我想在我的表单中添加一些部分 & headers,那么有没有办法 'slice' 表单字段或以其他方式仅迭代显示字段的一部分?

类似

{% 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.counter0forloop.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 and 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 %}

有关更多参考资料,您可以参阅 Modulus % in Django template to know about divisibleby and Is there a filter for divide for Django Template? 以获取有关如何在 Django 模板中划分数字的其他方法!