2011-06-16 79 views
3

我试图让自定义模板标记正常工作,但当我在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) 

你有为什么当我在有一个以上的项目为循环这个模板标签产生一个错误,但我成功当任何想法只有一个?

我还不完全理解这个模板标签语法的所有内部工作原理,所以我有一种感觉,我在某个地方犯了一个逻辑错误。任何意见非常感谢。

谢谢 乔

回答

4

当你变回self.userUser实例这里:

self.user = self.user.resolve(context) 

它的工作原理是第一次,但下一次,因为self.user不再是template.Variable实例,您将得到以下异常:'用户'对象没有'解析'属性“

一种解决方案是保存user & object比如在局部变量:

def render(self, context): 

    user_inst = self.user.resolve(context) 
    object_inst = self.object.resolve(context) 

    permissions_obj = object_inst.permissions(user_inst) 

    content = self.nodelist.render(context) 

    if hasattr(permissions_obj, self.permission): 
     perm_func = getattr(permissions_obj, self.permission) 
     if perm_func(): 
      return content 
    return "" 
+0

这一解决办法似乎很好地工作。谢谢! – 2011-06-16 13:41:07

+0

不客气。 – manji 2011-06-16 14:11:16