Django: ошибки пользовательского тега шаблона в цикле for - PullRequest
3 голосов
/ 16 июня 2011

Я пытаюсь заставить работать пользовательский тег шаблона, но у меня возникают некоторые трудности, когда я применяю тег в цикле 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»), ключевое слово «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 /missions_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 Ответ

4 голосов
/ 16 июня 2011

Когда вы меняете обратно self.user на User экземпляр здесь:

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

, он работает в первый раз, но в следующий раз, потому что self.user больше не является template.Variable экземпляром, вы получаете исключение: Объект «Пользователь» не имеет атрибута «resol» »

Одним из решений является сохранение 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 ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...