Django Форма как таблица

Следующий код на языке шаблонов django работает, но я не знаю почему. Цель этого кода - отобразить форму в виде таблицы с несколькими столбцами. Первое, что меня отталкивает, это то, что тег для открытия строки никогда не дается, но он все равно делается.

{% extends 'base.html' %}
{% load render_table from django_tables2 %}
{% block content %}
<form method="get">
    {% csrf_token %}
    <table>
        <tbody>
            {% for field in filter.form %}
    <td>{{ field.label}}</td>
    <td>{{ field }}</td>
                {% if forloop.counter|divisibleby:"4"%}
    </tr>
                {% endif %}
            {% endfor %}
        </tbody>
    </table>
    <input type="submit" value="Search">
</form>
{% render_table table%}
{% endblock %}

Это генерирует таблицу из четырех колонок. Можно ли как-то явно объявить открывающие теги? И почему этот код работает?

enter image description here

Я попытался явно создать теги для строки, но это не создало таблицу правильно. В ней было пустое место в строке и лишняя строка.

{% extends 'base.html' %}
{% load render_table from django_tables2 %}
{% block content %}

<form method="get">
    {% csrf_token %}
    <table>
        <tbody>
            {% for field in filter.form %}
                {% if forloop.counter|divisibleby:"5"%}
    <tr>
                {% endif %}
                {% if forloop.counter|divisibleby:"5" == False %}
    <td>{{ field.label}}</td>
    <td>{{ field }}</td>
                {% endif %}
                {% if forloop.counter|divisibleby:"5"%}
    </tr>
                {% endif %}
            {% endfor %}
        </tbody>
    </table>
    <input type="submit" value="Buscar">
</form>

{% render_table table%}
{% endblock %}

Почему это работает? HTML довольно небрежен, и браузеры могут сделать вывод о том, что вы пытаетесь сделать, исходя из контекста. td перед tr должна быть строка -> добавьте одну

можно ли как-нибудь явно объявить открывающие теги? Я думаю, что с помощью комбинации того, что у вас есть, и {% forloop.first %} + {% forloop.last %} это можно сделать. Что-то вроде:

<table>
  <tbody>
  {% for field in filter.form %}

    {% if forloop.first %}  
      <tr>
    {% endif %}

    <td>{{ field.label}}</td>
    <td>{{ field }}</td>

    {% if forloop.last %}  
      <tr>
    {% elif forloop.counter|divisibleby:"4"%}
      </tr>
      <tr>
    {% endif %}

  {% endfor %}
  </tbody>
</table>

Спасибо, я вставил следующий код, который также работает. Я думаю, что теперь он стал более продуманным. Первый if создает открывающий тег, так как следующий тег должен быть парой, созданной из делимых, которые находятся в elif, а if содержит последний тег, который должен быть только закрывающим тегом, так как если бы это была пара делимых тегов, это создало бы дополнительную строку.

{% extends 'base.html' %}
{% load render_table from django_tables2 %}
{% block content %}

<form method="get">
    {% csrf_token %}
    <table>
        <tbody>
            {% for field in filter.form %}
                {% if forloop.first %}
                    <tr>
                {% endif %}
                    <td>{{ field.label}}</td>
                    <td>{{ field }}</td>
                {% if forloop.last %}
                    </tr>
                {% elif forloop.counter|divisibleby:"4"%}
                    </tr>
                    <tr>
                {% endif %}
            {% endfor %}
        </tbody>
    </table>
    <input type="submit" value="Buscar">
</form>

{% render_table table%}
{% endblock %}
Вернуться на верх