2012-02-25 80 views
2

这里是我的simple_tag代码Django的:在模板评估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模板中有其他方式来评估标签结果吗?

回答

11

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

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


{% if request|has_right:groupname %} 
+1

我花了大约3个小时试图弄清楚了我的模板标签,这是终于得到了它的工作,我做这一切错误的注释。谢谢:D – Designer023 2013-06-24 15:02:03

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。

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%}