如何从Django模板中的模型和字段中获取模型字段值?

时间:2020-03-26 11:50:53

标签: python django django-views django-templates

我想创建一个模板,用于在表格中打印我的模型的值。这应该适用于各种模型。

我在想,当将特定模型的所有对象放入行中并将该模型的特定字段放入列中时,我可以在单元格中获取值。这是我的主意:

# 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 个答案:

答案 0 :(得分:1)

解决方案是创建自定义模板标签。

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>

希望有人会发现这很有用:)

答案 1 :(得分:0)

假设您的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})
```

模板

<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>