Как построить таблицу объектов, не зная их атрибутов?

Я пытаюсь построить таблицу динамически в моем шаблоне django. Я получил имена столбцов в моем views.py, а также получил содержимое таблицы:

    table = tenant_tables.models[table_name].objects.all()
    headers = table.model._meta.get_fields(include_parents=True, include_hidden=False)
    context = {'table': table, 'headers': headers}
    return render(request, template_name=template_name, context=context)

На основе полученных данных я хочу построить таблицу с помощью шаблона, но я не знаю, как отсортировать все атрибуты объекта

<table
                id="example"
                class="table table-striped data-table"
                style="width: 100%"
              >
                  <thead>
                    <tr>
                      {% for header in headers %}
                      <th>{{header.verbose_name}}</th>>
                      {% endfor %}
                    </tr>
                  </thead>
                  <tbody>
                  {% for obj in table  %}
                    <tr>
                        <td>{{obj}}</td>
                    </tr>
                  {% endfor %}
                  </tbody>
                  <tfoot>
                    <tr>
                      {% for header in headers %}
                          <th>{{header.verbose_name}}</th>>
                      {% endfor %}
                    </tr>
                  </tfoot>
          </table>

Могу ли я реализовать это или мне следует создать представление для каждой модели в моем приложении?

Да, это возможно реализовать. Но сначала вам нужно реализовать пользовательский фильтр, который работает подобно функции getattr в python.

Тогда вы можете сделать следующее:

...
<tbody>
    {% for obj in table  %}
        <tr>
            {% for header in headers %}
                <td>{{ obj | getattr_filter:header }}</td>
            {% endfor %}
            <td>{{obj}}</td>
        </tr>
    {% endfor %}
</tbody>
...

Фильтр должен выглядеть примерно так:

@register.filter(name='getattr_filter')
def getattr_filter(obj, attribute):
    return getattr(obj, attribute, None)

Посмотрите документы для получения более подробной информации о том, как реализовать пользовательский фильтр шаблонов.

Вернуться на верх