我试图让自定义模板标记正常工作,但当我在for循环中将迭代中的多个项应用于标记时遇到一些困难。Django:for循环中的自定义模板标记错误
我想让标签看起来如下,只显示文本“工作”,如果我的权限函数评估为True。
模板代码
{% load permission_tags %}
{% for group in groups %}
<div>{% permission request.user can_edit_group on group %}WORKED{% endpermission %}</div>
{% endfor %}
标签基本上发生在用户实例,一个权限字符串(即“can_edit_group”),“开”关键字(只是为了语法不错)和对象实例来检查权限。
我在这里的权限框架我认为工作正常,不是我的问题的一部分。我遇到的困难是
"Caught AttributeError while rendering: 'User' object has no attribute 'resolve'"
templatetags/permission_tags.py in render, line 23 (I've marked line 23 below)
for循环包含多个组时出现模板错误。这个标签只用一个组就可以很好地工作,但如果我添加多个标签,就会弹出。
模板标签调用templatetags权限/ permission_tags.py
from django import template
register = template.Library()
def permission(parser, token):
try:
tag_name, username, permission, onkeyword, object = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError("%r tag requires exactly 4 "
"arguments" % token.contents.split()[0])
nodelist = parser.parse(('endpermission',))
parser.delete_first_token()
return PermissionNode(nodelist, username, permission, object)
class PermissionNode(template.Node):
def __init__(self, nodelist, user, permission, object):
self.nodelist = nodelist
self.user = template.Variable(user)
self.permission = permission
self.object = template.Variable(object)
def render(self, context):
self.user = self.user.resolve(context) # <---- Line 23
self.object = self.object.resolve(context)
# My custom permissions code. I don't think it's
# causing the error I am experiencing
permissions_obj = self.object.permissions(self.user)
content = self.nodelist.render(context)
# My custom permissions code. I don't think it's causing
# the error.
if hasattr(permissions_obj, self.permission):
perm_func = getattr(permissions_obj, self.permission)
if perm_func():
return content
return ""
register.tag('permission', permission)
你有为什么当我在有一个以上的项目为循环这个模板标签产生一个错误,但我成功当任何想法只有一个?
我还不完全理解这个模板标签语法的所有内部工作原理,所以我有一种感觉,我在某个地方犯了一个逻辑错误。任何意见非常感谢。
谢谢 乔
这一解决办法似乎很好地工作。谢谢! – 2011-06-16 13:41:07
不客气。 – manji 2011-06-16 14:11:16