Вывод набора форм 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>
Вернуться на верх