Как получить значение поля модели из модели и поля в шаблоне django? - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы создать шаблон для печати значений моих моделей в таблице. Это должно работать для различных моделей.

Я думал, что, когда я помещаю все объекты указанной c модели в строки и задаю c поля этой модели в столбцы, я могу получить значения в ячейках. Это моя идея:

# views.py

def users(request):
    all_users = models.CustomUser.objects.all()
    fieldnames = ['id', 'email', 'first_name', 'last_name', 'department']
    fields = [all_users[0]._meta.get_field(field) for field in fieldnames]
    context = {
        'rows': all_users,
        'columns': fields,
    }
    return render(request, 'table.html', context=context)
# table.html

<table>
<tr>
    {% for col in columns %}
    <th>{{ col.verbose_name }}</th>
    {% endfor %}
</tr>
{% for row in rows %}
<tr>
    {% for col in columns %}
    <td>{{ row|col }}</td>            # or row.col or row:col
    {% endfor %}
</tr>
{% endfor %}
</table>

Как мне туда добраться? Это правильный способ мышления и действий? Или я должен как-то управлять данными перед рендерингом?

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Решением было создание пользовательского тега шаблона.

в users/templatetags/table_tags.py

from django import template

register = template.Library()

@register.filter
def value_from_model(model, field):
    return getattr(model, field)

в users/views.py

def users(request):
    all_users = models.CustomUser.objects.all()
    fieldnames = ['email', 'first_name', 'last_name', 'department']
    fields = [all_users[0]._meta.get_field(field) for field in fieldnames]
    context = {
        'rows': all_users,
        'cols': fields,
    }
    return render(request, 'users/table.html', context=context)

в users/templates/users/table.html

{% load table_tags %}

<table>
    <tr>
        {% for col in cols %}
        <th>{{ col.verbose_name }}</th>
        {% endfor %}
    </tr>
    {% for row in rows %}
    <tr>
        {% for col in cols %}
        <td>{{ row|value_from_model:col.name }}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</table>

Надеюсь, кто-нибудь найдет это полезным:)

0 голосов
/ 26 марта 2020

Предполагая, что ваша модель customUser имеет то же имя, что и имена полей

views.py

```python
def users(request):
        all_users = models.CustomUser.objects.all()
        list_colmns = ['id', 'email', 'first_name', 'last_name', 'department']
        list_rows = []
        for user in all_users:
            list_rows.append(
                [user.id, user.email, user.first_name, user.last_name, user.department])
        return render(request, 'table.html', {"list_rows": list_rows, "list_colmns": list_colmns})
```

Template

<table>
<tr>
    {% for column in list_colmns %}
    <th>{{ column }}</th>
    {% endfor %}
</tr>
{% for row in list_rows %}
<tr>
    {% for cell in row %}
        <td>{{ cell }}</td>
    {% endfor %}
</tr>
{% endfor %}
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...