Django:for循环中的自定义模板标记错误

时间:2011-06-16 07:26:12

标签: django templates tags

我正在尝试使用自定义模板标记,但是当我在for循环中应用标记并且正在迭代的东西中有多个项目时,我遇到了一些困难。

我希望标签看起来如下所示,如果我的权限功能评估为True,则只显示文本“WORKED”。

模板代码

{% load permission_tags %}
{% for group in groups %}
<div>{% permission request.user can_edit_group on group %}WORKED{% endpermission %}</div>
{% endfor %}

标记基本上包含用户实例,权限字符串(即“can_edit_group”),“on”关键字(只是为了使语法更好)和一个用于检查权限的对象实例。

我在这里的权限框架我认为工作正常,并不是我的问题的一部分。我遇到的困难是

"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)

当我在for循环中有多个项目时,你知道为什么这个模板标签会产生错误但是当我只有一个项目时会成功吗?

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

谢谢你, 乔

1 个答案:

答案 0 :(得分:4)

当您在此处将self.user更改回User个实例时:

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

它第一次运行,但下一次,因为self.user不再是template.Variable实例,您会遇到异常: '用户'对象没有属性'解决'“

一种解决方案是保存user&amp;局部变量中的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 ""