Как взять имена столбцов таблицы модели Django (queryset) в список, шаблон или другую переменную?
Добрый день!
У меня есть табличная модель в Django model. С именованными именами столбцов полей.
Я собираюсь разместить эту модель в таблице в шаблоне. Но у меня 8 ... 9 столбцов.
Я хотел бы не указывать названия колонок таблицы в заголовке вручную.
И чтобы он заполнялся из списка, как это чаще всего бывает в теле таблицы. Как можно вытащить взять из модели или запроса в списке названия колонок полей?
заголовок из queryset ("verbose_name") или модель ?
шаблон
<table>
<tr>{% for item in header %}<th>{{ item }}</th>{% endfor %}</tr>
{% for row in rows %}
<tr>{% for cell in row %}<td>{{ cell }}</td>{% endfor %}</tr>
{% endfor %}
</table>
Модель
class Model_1(models.Model):
name1 = models.ForeignKey(Model_2, on_delete=models.CASCADE, verbose_name="Name_0")
name2 = models.ForeignKey(Model_3, on_delete=models.CASCADE, verbose_name="Name1")
date3 = models.DateField(verbose_name="Name2")
Вы можете использовать метод model._meta.get_fields() для получения всех полей модели, а затем использовать атрибут verbose_name каждого поля для создания списка имен столбцов для заголовка таблицы. Вот пример того, как это сделать в представлении:
header = [field.verbose_name for field in Model_1._meta.get_fields()]
Затем вы можете передать переменную header в контекст шаблона и использовать ее для отображения названий столбцов в заголовке таблицы.
Этого можно добиться и с помощью набора queryset. Вы можете использовать метод values() на queryset, чтобы вернуть список словарей, содержащих имена столбцов в качестве ключей и их значения. Затем вы можете извлечь ключи (имена столбцов) из первого словаря в списке, чтобы использовать его в качестве заголовка в вашем шаблоне.
# Get column names from queryset.
header = list(queryset.values().first().keys())
# Get rows from queryset
rows = list(queryset.values())
<div class="container">
<table class="table">
<thead>
<tr>
{% for item in headers %}
<th>{{ item }}</th>
{% endfor %}
</tr>
</thead>
{% for row in rows %}
<tr>
{% for cell in row %}
<td>
{{ cell }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</div>