django:在模板中评估simple_tag结果

时间:2012-02-25 05:45:38

标签: django django-templates

这是我的simple_tag代码

@register.simple_tag
def has_right(request,groupname):
    if permission(request,groupname):
        return True
    return False

这就是我在模板

中尝试做的事情
 {% if has_right request 'admin' %}
    display admin link
 {%endif%}

但它抱怨

Exception Value:    
Unused 'request' at end of if expression.

在django模板中还有其他方法来评估标记结果吗?

3 个答案:

答案 0 :(得分:13)

如果你需要计算一个值,你不需要一个标记,你想要一个过滤器。

@register.filter
def has_right(request,groupname):
    ...


{% if request|has_right:groupname %}

答案 1 :(得分:0)

它之所以没有按照你想要的方式运行,是因为模板处理器看到了{%if%}标签并开始将其作为{%if%}标签处理,这不是你想要的。看起来你想要一种复杂的表达式,它会评估if的内容,然后将其用于条件处理。

我不太确定这是否是您的意思,但我认为更简单的解决方案是使用Django中的内置权限。每个用户对象都已经附加了权限,添加和删除新权限也相当简单。 https://docs.djangoproject.com/en/dev/topics/auth/#permissions是您要查看的链接。所以在那里,你应该在你的模型中或在视图中动态设置一些权限,然后在模板方面,你所要做的就是说

# Note that perms is a shortcut. Its the same as saying user.has_perm('')
{% if perms.has_that_permission %}

但是比我想的还要冷却,每个用户都已经拥有了is_staff和is_superuser。因此,如果您的应用目前没有使用这些内容,我认为至少使用is_staff为您的网站授予用户权限是没有害处的。确保你没有给他们超级用户权限,因为超级用户意味着任何对user.has_perm()的调用都将返回TRUE,无论如何。

答案 2 :(得分:0)

您可以使用分配标记。

@register.assignment_tag(takes_context=True)
def has_right(context,groupname):
    request = context['request']
    if permission(request,groupname):
         return True
    return False

在模板中

{% has_right as right %}
{% if right request 'admin' %}
    display admin link
{%endif%}