在模板标签中使用django权限

时间:2017-04-13 20:38:38

标签: python django oauth

我目前正在检查模板中的权限,以决定是否要显示特定链接。

这适用于我的普通模板中扩展的base.html:

base.html文件

{% if perms.myapp.can_add %}
    #display link
{% endif %}

我的模板

{% extends "riskass/base.html" %}
{% block content %}
    # do stuff #
{% endblock %}

但我也使用模板中的重复项目的模板标签,并且相同的权限检查似乎不起作用。

有没有人知道我可能做错了什么?谢谢!

我的模板

{% extends "riskass/base.html" %}

{% load show_items %}

{% block content %}
    # do stuff #
    {% show_items items_list%}
{% endblock %}

templatetags / show_items.py

from django import template

register = template.Library()

@register.inclusion_tag('myapp/show_items.html')
def show_items(items):
    return {'items': items}

的myapp / show_items.html

{% for item in items%}

    # display stuff: this works
    ...

    # check permissions: 
     {% if perms.myapp.can_add %}
        #display other link: doesn't do anything
     {% endif %}

1 个答案:

答案 0 :(得分:0)

perms是模板上下文的一部分,您的模板“my template”正在其中呈现。但默认情况下,您的包含标记模板myapp/show_item.html有自己的上下文,不会继承perms或任何其他模板变量,除非您通过在标记注册中传递takes_context=True来安排它只需要一些代码就可以将部分或全部上下文传递到标记模板上下文中。

在Django文档中有一个例子:

https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/#inclusion-tags

这有点令人困惑,因为文档似乎暗示您可以 将自己的参数传递给标记方法传递上下文,但不能同时传递两者。然而事实并非如此。将takes_context=True传递给@register.inclusion_tag()时,效果将是django将context作为标记函数的第一个参数传递,后跟您希望传递给标记的任何参数。传递的上下文是您的标记所在模板的上下文...因此您可以从中获取所需内容并将其传递给包含的模板,例如:

@register.inclusion_tag('riskass/show_ratings.html', takes_context=True)
def show_ratings(context, ratings):
    return {
        'ratings': ratings,
        'perms': context.get('perms', None)
    }

标签用法如下所示:

{% show_ratings ratings_list %}

在其他Stack Overflow问题和答案中有一些有用的信息,虽然它与您可能想要查看的问题不完全相同:

Pass a context variable through an inclusion tag