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模板循环一些表行只显示一次

Django模板 - 查找列表中的至少一项是不是出现在其他列表中

如何在 django 中列出用户不属于的所有组?

在 Django 模板的 Bootstrap 列表组中显示数据

DJANGO:在模板中显示多对多的附加字段

如果事件每 X 分钟发生一次以上,则仅计算一次事件