Вывод набора форм django в виде строк таблицы
У меня есть набор форм Django, который я хотел бы вывести в виде одной строки таблицы на каждую вложенную форму, например, так:
<form>
{{ feature_formset.management_form }}
<table>
{% for form in feature_formset %}
<tr>
{% for field in form %}
<td>{{ field.name }} {{ field }}</td>
{% endfor %}
</tr>
</table>
{% endfor %}
</form>
Однако каким-то образом (я думаю) автоматический рендеринг полей сбивается оберткой table
.
То, что я ожидал бы получить, будет выглядеть так:
<form>
...
<table>
<tr>
<td>id: <input ...></td>
<td>name: <input ...></td>
<td>foobar: <input ...></td>
</tr>
<tr>
<td>id: <input ...></td>
<td>name: <input ...></td>
<td>foobar: <input ...></td>
</tr>
<tr>
<td>id: <input ...></td>
<td>name: <input ...></td>
<td>foobar: <input ...></td>
</tr>
</table>
{% endfor %}
</form>
Однако я получаю строку формы для первой формы набора форм, а остальные формы просто сбрасывают поля. Каким-то образом {% for field in form %}
не выполняет итерацию должным образом, и я предполагаю, что оставшиеся поля сбрасываются:
<form>
...
<table>
<tr>
<td>id: <input ...></td>
<td>name: <input ...></td>
<td>foobar: <input ...></td>
</tr>
id: <input ...>
name: <input ...>
foobar: <input ...>
id: <input ...>
name: <input ...>
foobar: <input ...>
</table>
{% endfor %}
</form>
Подскажите, почему пользовательский рендеринг вложенных форм / полей не работает так, как задумано?
Вы закрываете таблицу слишком рано, поэтому:
<form>
{{ feature_formset.management_form }}
<table>
{% for form in feature_formset %}
<tr>
{% for field in form %}
<td>{{ field.name }} {{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</form>
Таким образом, </table>
ставится после {% endfor %}
.
Проблема возникает из-за неправильного размещения тега </table>
. Вы закрываете таблицу внутри цикла {% for form in feature_formset %}
, что приводит к корректному отображению только первой формы в строке таблицы.
Чтобы исправить это, просто переместите закрывающий </table>
тег за пределы цикла:
<form>
{{ feature_formset.management_form }}
<table>
{% for form in feature_formset %}
<tr>
{% for field in form %}
<td>{{ field.name }}: {{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</form>