如何在django的模板引擎中进行列表交集?

时间:2013-05-30 13:10:15

标签: python django django-templates

好的,我正在尝试展示一个包含用户/角色的简单表格。

我有一个角色名称列表,用户被定义为......

[{
    '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它没有帮助。)

也许有一种疯狂的方法,但我想要完成的是清晰的表达逻辑 - 在我看来这意味着它应该可以在模板中使用吗?

我怎样才能真正实现这一目标?

注意:我 设法通过让角色成为布尔列表并假设RolesUser.Roles的顺序不变而设法使其工作,但这似乎很脆弱可能在将来破裂。

1 个答案:

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