如何在django中编写更好的模板标签

时间:2009-12-01 18:28:26

标签: django django-templates

我已经看过如何编写模板标签,根据像这样的模板设置上下文变量

{% my_template_tag 'blah' as my_context_variable %}

但我希望能够做到这一点:

鉴于groupuser都在视图的上下文中设置

{% is_in_group group user as is_member %}

{% if is_member %}
   #.... do stuff ....
{% endif %}

或理想情况下:

{% if is_in_group group user %}
   # ....
{% end if %}

显然,另一种方法是在视图中设置is_member - 但这只是一个例子,无论如何都知道如何做这样的事情会很好!

4 个答案:

答案 0 :(得分:13)

Evgeny对smart_if模板标签有个好主意。但是,如果这不起作用,您可能会发现自定义过滤器更易于编写以进行此类比较。类似的东西:

@register.filter
def is_in(obj, val):
    return val is in obj

你会像这样使用它:

{% if user|is_in:group.users %}

答案 1 :(得分:4)

{{ perms.model_name.permission_name }}出了什么问题? (附带django.core.context_processors.auth。)

Django组只是权限的集合,允许或禁止访问特定项目应该是个人许可。

或者,如果你真的想编写自己的标签或过滤器,那就是lots of documentation。如果这不起作用,您可以使用其他模板语言,它们可以做您想要的更好。

然而,我希望写一个标签是不必要的。 Django非常擅长已经弄清楚你真正想做什么。有时需要花一些时间才能找到答案。

答案 2 :(得分:3)

使用smart if代码尝试此操作:

{% if group in user.groups %}
    ...
{% endif %}

答案 3 :(得分:0)

丹尼尔的过滤器应该可以解决问题。作为模板标签,它可能是这样的:

class IsInGroupNode(Node):
    def __init__(self, group, user, varname):
        self.member =  template.Variable(user)
        self.group = template.Variable(group)
        self.varname = varname


    def render(self, context):
        self.group = self.group.resolve(context)
        self.user = self.user.resolve(context)
        context[self.varname] = self.user in self.group.user_set.all()
        return  ''


def is_in_group(parser, token):
    bits = token.contents.split()
    #some checks
    return IsInGroupNode(bits[1], bits[2],bits[4])

is_in_group = register.tag(is_in_group)

在模板中,您将使用标记签名

{% is_in_group group user as is_member %}