Django模板 - 有条件地为登录用户显示按钮

时间:2012-07-12 14:32:25

标签: python django django-templates

我的Django应用程序中有一个页面需要执行以下操作之一,具体取决于与页面上显示的组(不是Django用户组;我的应用程序自定义内容)相关的登录用户的状态:

  1. 如果用户可以加入群组,请显示加入群组的链接。
  2. 如果用户在该组中,则显示一个离开该组的链接。
  3. 如果用户无法加入群组,请不要显示任何一个链接。
  4. 这样做的一种方法是创建三个模板(一个带有连接链接,一个带有离开链接,一个没有链接),并在视图中选择合适的一个。我觉得拥有三个不同的模板只会在一行代码中有所不同可能有点过头了,所以我还没有走过那条路。

    不可能仅使用模板显示条件1和2的正确内容,如果是,我认为这不可取。用户到组是多对多关系,确定组成员身份需要将用户传递给组或将组传递给用户。

    由于Django模板不允许传递函数参数,我试图通过使用get_context_data将上下文变量传递给模板来解决这个问题。

    def get_context_data(self, **kwargs):
        context = super(NetworkDetails, self).get_context_data(**kwargs)
        user = ???
        context['in_group'] = user.in_group(context['group_detail'])
        return context
    

    如果我这样做,如何在该方法中获取当前登录的用户?如果那是不可能的,我还可以在模板之外的哪些地方获取该信息?是否有一种可接受的方法可以做这样的事情?

    谢谢!

3 个答案:

答案 0 :(得分:5)

  

这样做的一种方法是创建三个模板(一个带有   加入链接,一个带有离开链接,一个没有链接)并选择   视图中适当的一个

这很有趣,因为如果你可以选择要包含的模板,你可以选择要显示的html。而不是:

{% if join_link %}
    {% include 'join_link.html' %}
{% endif %}
{% if leave_link %}
    {% include 'leave_link.html' %}
{% endif %}
{% if not join_link and not leave_link %}
    you can't join
{% endif %}

你可以:

{% if join_link %}
    <a href="{{ join_link }}">join</a>
{% endif %}
{% if leave_link %}
    <a href="{{ leave_link }}">leave</a>
{% endif %}
{% if not join_link and not leave_link %}
    you can't join
{% endif %}

所以,我不明白你为什么要使用模板包含。

  

如果我这样做,如何在该方法中获取当前登录的用户?

self.request.user
self.request.user.is_authenticated() # return True if the user is logged in

答案 1 :(得分:0)

您可以在视图中确定条件,并使用上下文将适当的标记传递给模板。

如果有多个视图/模板需要此信息,您可以实现自定义上下文处理器,该处理器可以在上下文中添加此信息,并在每个模板中提供。

或者如果您的应用中有OneToOne或任何此类与User的关系,您可以在该模型中实施该方法。

答案 2 :(得分:0)

您可以通过检查权限来检查用户是否已登录 https://docs.djangoproject.com/en/dev/topics/auth/你也可以为你的其他需要做同样的事情。