好的,我正在尝试展示一个包含用户/角色的简单表格。
我有一个角色名称列表,用户被定义为......
[{
'Username': 'Bob',
'Roles': ['Admin']
},
{
'Username': 'Sheila',
'Roles': ['Admin', 'Manager']
}]
我想要制作的是这样的......
Username Manager Admin SomeRoleNobodyHas
Bob No Yes No
Sheila Yes Yes No
我正在使用此上下文呈现视图
Data = {'Roles': ['Admin', 'Manager', 'SomeRoleNobodyHas'],
'Users': Users}
我认为这将是微不足道的(之前从未接触到模板引擎,我通常会返回Json)。输出列标题很容易,所以跳到tbody ...
首先我试过......
{% for User in Users%}
<td>{{User.Username}} ({{User.Id}}) </td>
{% for Role in Roles%}
<td>{%if Role in User.Roles%}Y{%else%}N{%endif%}</td>
{% endfor %}
{% endfor %}
但这给了我一个语法错误。由于this answer暗示我试图在html中做太多,我修改了我的上下文添加
'UserTable': [
{'Id': x['Id'],
'Username': x['Username'],
'EmailAddress': x['Email'],
'IsLocked': x['IsLocked'],
'Roles': dict(zip(Roles, [y in x['Roles'] for y in Roles]))
} for x in Users]
所以现在我应该有User['Roles'][RoleName]
保证存在并且是真或假。然后我遍历UserTable
而不是Users
不幸的是,当密钥来自另一个迭代器时,我无法弄清楚如何从字典中查找值...
{% for Role in Roles%}
<td>{{Role}}: {%if User.Roles.Role == True%}Y{%else%}N{%endif%}</td>
{% endfor %}
这总是评估为假(我相信它正在进行User['Roles']['Role']
而不是User['Roles'][Current value of {{Role}}]
)(是的,我已经尝试使用明确的== True
它没有帮助。)
也许有一种疯狂的方法,但我想要完成的是清晰的表达逻辑 - 在我看来这意味着它应该可以在模板中使用吗?
我怎样才能真正实现这一目标?
注意:我 设法通过让角色成为布尔列表并假设Roles
和User.Roles
的顺序不变而设法使其工作,但这似乎很脆弱可能在将来破裂。
答案 0 :(得分:0)
简而言之,您无法在django模板中以这种方式查找User['Roles'][Role]
。但是,以下代码应生成您在问题中提到的表:
使用此上下文:
all_roles = set(role for role in user['Roles'] for user in Users)
cx ={
'AllRoles': list(all_roles),
'Users': Users,
}
您可以在模板中制作表格,如下所示:
<table>
<tr>
<th>Username</th>
{% for role in AllRoles %}
<th>{{ role }}</th>
{% endfor %}
</tr>
{% for user in UserTable %}
<tr>
<td>{{ user.Username }}</td>
{% for role in AllRoles %}
<th>{% if role in user.Roles %}Yes{% else %}No{% endif %}</th>
{% endfor %}
</tr>
{% endfor %}
</table>