Как взять имена столбцов таблицы модели 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>
Вернуться на верх