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 %}
Это генерирует таблицу из четырех колонок. Можно ли как-то явно объявить открывающие теги? И почему этот код работает?
Я попытался явно создать теги для строки, но это не создало таблицу правильно. В ней было пустое место в строке и лишняя строка.
{% 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 %}