Django模板:如果用户属于多个组,则仅显示一次链接
Posted
技术标签:
【中文标题】Django模板:如果用户属于多个组,则仅显示一次链接【英文标题】:Django template: Show a link only once if a user belongs in more than one groups 【发布时间】:2018-02-12 11:05:39 【问题描述】:我在django
中有一个template
,如果用户的组名与患者不同,则会显示一个链接。
我的代码是:
% if user.is_authenticated %
% for group in user.groups.all %
% if group.name != 'Patient' %
<li % if request.get_full_path == modules_url % class="active" % else% class="inactive"% endif %>
<a href="% url 'modules' %"><b style="color:#ff9904;">Modules</b></a>
</li>
% endif %
% endfor %
% endif %
如果用户是四个不同组的成员,则链接 Modules
在模板中显示 4 次。
有没有办法只显示一次?
【问题讨论】:
【参考方案1】:我认为通过处理使用模板标签应该更容易。
from django import template
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='has_group')
def has_group(user, group_name):
"""
% if request.user|has_group:'grouName' %
# do_stuff #
% endif %
return Boolean (True/False)
"""
group = Group.objects.get(name=group_name)
return group in user.groups.all()
基本上你也可以这样做来获得第一组:
% if user.groups.all.0 == 'Patient' %
...
% endif %
【讨论】:
但是Patient组不是第一个的情况呢? 这就是我推荐你使用模板标签的原因。【参考方案2】:感谢here,我找到了解决方案。我使用了forloop.counter
变量。
% if user.is_authenticated %
% for group in user.groups.all %
% if group.name != 'Patient' %
% if forloop.counter < 2 %
<li % if request.get_full_path == modules_url % class="active" % else% class="inactive"% endif %>
<a href="% url 'modules' %"><b style="color:#ff9904;">Modules</b></a>
</li>
% endif %
% endif %
% endfor %
% endif %
【讨论】:
以上是关于Django模板:如果用户属于多个组,则仅显示一次链接的主要内容,如果未能解决你的问题,请参考以下文章
Django模板 - 查找列表中的至少一项是不是出现在其他列表中