Как отобразить form.as_table в нескольких столбцах
Я использую форму модели, и у меня есть рендеринг этой формы в шаблоне, как показано ниже.
<table>
{{form.as_table}}
</table>
Но проблема в том, что все поля отображаются в виде строк. Поскольку моя модель содержит более 200 строк, при отображении элементов в 200 строк она выглядит плохо. Я хочу разделить их на 5 столбцов, поэтому общее количество строк будет около 40-43. Есть ли какой-либо встроенный тег шаблона, доступный для этого или любого другого способа, с помощью которого мы можем решить проблему.
6 ответов
Вы можете сослаться на этот документ: цикл по полям формы
Что вы можете сделать в своем шаблоне
{% for field in form %}
{%if forloop.counter|divisibleby:"5" %}
{#after 5 fields, somehow put elements in next row
of table, paragraph, or using divs etc
#}
{%endif%}
{{field}}
{%endfor%}
Это работало лучше для меня (делится на: n, n = количество столбцов):
<form enctype="multipart/form-data" method="POST">
{% csrf_token %}
{% for field in form %}
{{ field.label }} {{ field }}
{% if forloop.counter|divisibleby:"2" %}
<br>
{% endif %}
{% endfor %}
<input type="submit" value="Continue" />
</form>
Ваш вопрос немного неясен, однако этого примера более чем достаточно.
цикл перебирает список data
и я заменил так, чтобы он отображал column1,column2,column3,column4,column5
в каждом ряду для примера.
<!DOCTYPE html>
<html>
<head>
<title>Jack of All Trades</title>
</head>
<body>
<table border="1">
{% for element in data %}
<tr>
<td><p>column 1 </p></td>
<td><p>column 2 </p></td>
<td><p>column 3 </p></td>
<td><p>column 4 </p></td>
<td><p>column 5 </p></td>
</tr>
{% endfor %}
</tr>
</table>
</body>
</html>
Если предположить, data
имеет 5 элементов, это будет производить что-то вроде этого:
Еще один вариант, который следует учитывать в более новых версиях Django, — использовать повторно используемые шаблоны форм для создания шаблона формы для вызова как , точно так же, как вы бы вызывали{{ form.as_table }}
в вашем шаблоне.
У этого есть несколько приятных особенностей:
- А
FormSet
каждая форма завернута в<tr>
но поля, завернутые в<td>
может сосуществовать с другими хорошими надстройками, такими как django-dynamic-formset - Этот метод можно использовать для других элементов, с помощью которых вы, возможно, захотите отображать формы.
Шаги:
- Создать
RenderMixin
который реализует какas_td()
метод, который будет называться как в вашем шаблоне
from django.forms.utils import RenderableMixin
class ColumnRenderableFormMixin(RenderableMixin):
def as_td(self):
"""Render as <td> elements excluding the surrounding <table> tag."""
return self.render(self.template_name_td)
- Создайте многоразовый шаблон в каталоге шаблонов вашего приложения (или другом подходящем каталоге).
- Шаблон будет выглядеть так же, как стандартные шаблоны Django в django/forms/templates/django/forms/*.html.
- Голый пример костей, помещенный в
someapp/templates/td.html
может быть:
{% for field, errors in fields %}
<td>
{{ errors }}
{{ field }}
</td>
{% endfor %}
- Добавьте пользовательский миксин в свою форму и укажите
td.html
путь к файлу шаблона вtemplate_name_td
переменная класса:
class SomeForm(ModelForm, ColumnRenderableFormMixin):
template_name_td = "someapp/td.html"
- В шаблоне представления отобразите форму с помощью
{{ form.as_td }}
.
- Если вы используете набор форм, это будет выглядеть следующим образом:
<table class="table">
{% for form in formset %}
<tr>
{{ form.as_td }}
</tr>
{% endfor %}
</table>
Я использую bootstrap 4, а имя тега формы - employee_in. В каждом из двух столбцов есть 6 полей ввода (исправлено, кто-нибудь еще знает, как сделать это автоматически?), Что я могу сделать до сих пор, надеюсь, это поможет
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
<div class="container-fluid">
<div class="row">
<div class="col-lg-6">
<table class = 'table table-hover'>
{% for my_divider in employee_in %}
{% if forloop.counter <= 6 %}
<tr>
<td>{{ my_divider.label }}</td>
<td>{{ my_divider }}</td>
</tr>
{% endif %}
{% endfor %}
</table>
</div>
<div class="col-lg-6">
<table class = 'table table-hover'>
{% for my_divider in employee_in %}
{% if forloop.counter > 6 %}
<tr>
<td>{{ my_divider.label }}</td>
<td>{{my_divider}}</td>
</tr>
{% endif %}
{% endfor %}
</table>
</div>
</div>
<input type="submit" class = 'btn btn-secondary' value="Submit">
</div>
</form>
<form method="POST">
{% csrf_token %}
<table>
{% for field in form %}
<tr>
<td>{{ field.label}}</td>
<td>{{ field }}</td>
</tr>
{% endfor %}
</table>
<button type="submit" class="btn btn-primary">Submit</button>