我已经看过如何编写模板标签,根据像这样的模板设置上下文变量
{% my_template_tag 'blah' as my_context_variable %}
但我希望能够做到这一点:
鉴于group
和user
都在视图的上下文中设置
{% is_in_group group user as is_member %}
{% if is_member %}
#.... do stuff ....
{% endif %}
或理想情况下:
{% if is_in_group group user %}
# ....
{% end if %}
显然,另一种方法是在视图中设置is_member
- 但这只是一个例子,无论如何都知道如何做这样的事情会很好!
答案 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 %}