【发布时间】:2016-06-09 21:56:36
【问题描述】:
我有一个用作条件块的自定义 Django 模板标签:
{% if_has_permission request "some_permission" %}
<div>
<input type="text" name="sample_1">
<label><input type="checkbox" name="enable_it"> Enable</label>
</div>
{% endif_has_permission %}
在本例中,如果请求对象没有适当的权限(在本例中为some_permission),则不会呈现块。但是,只要我在这个块中注入一个条件(使用{% if %} 模板标签),我就会得到一个 TemplateSyntaxError:
{% if_has_permission request "some_permission" %}
<div>
<input type="text" name="sample_1">
<label><input type="checkbox" name="enable_it" {% if isChecked %}checked="checked"{% endif %}> Enable</label>
</div>
{% endif_has_permission %}
我看到的错误是:
无效的块标签:'endif',应为'endblock'
如果有的话,我可以做些什么来在我的自定义标签中允许条件表达式?我很确定{% if %} 是我唯一需要允许的情况,尽管偶尔的{% for %} 也可能有用。
这是我的自定义模板标签代码:
@register.tag
def if_has_permission(parser, token):
try:
args = token.split_contents()
tag_name, request, to_check = args[0], args[1], args[2]
opts = None
if(len(args) > 3):
opts = args[3:]
except IndexError:
raise template.TemplateSyntaxError("Tag %r requires at least two arguments" % tag_name)
if(not (to_check[0] == to_check[-1] and to_check[0] in ('"', "'"))):
raise template.TemplateSyntaxError("The second argument to tag %r must be in quotes" % tag_name)
nodelist_true = parser.parse(('endif_has_permission'),)
parser.delete_first_token()
return CheckPermissionNode(request, to_check[1:-1], opts, nodelist_true)
class CheckPermissionNode(template.Node):
def __init__(self, request, to_check, opts, nodelist_true):
self.request = template.Variable(request)
self.to_check = to_check
self.opts = opts
self.nodelist_true = nodelist_true
def render(self, context):
rq = self.request.resolve(context)
# Admins can always see everything
if(rq.session['is_admin']):
return self.nodelist_true.render(context)
# Check to see if any of the necessary permissions are present
hasPerm = False
checkList = self.to_check.split('|')
for c in checkList:
if(c in rq.session['perms']):
hasPerm = True
break
if(hasPerm):
return self.nodelist_true.render(context)
else:
return ''
【问题讨论】:
-
为什么必须将'if'条件提取到模板标签中? (我很好奇)。您不能将逻辑移至常规的“如果”可以完成工作吗? (好久没用django了)
-
我正在考虑类似这个答案stackoverflow.com/questions/25645219/…
-
您是否考虑过使用filters 代替标签?对我来说似乎更合适。检查这个答案,它解决了类似于你的问题stackoverflow.com/a/7791823/1345165
-
我的知识可能已经过时了,但我想知道您是否需要额外的“如果”...
{% if if_has_permission request "some_permission" %} -
这可能会有所帮助...stackoverflow.com/questions/22556052/…