Я пытаюсь заставить работать пользовательский тег шаблона, но у меня возникают некоторые трудности, когда я применяю тег в цикле 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 содержится более одного элемента, но успешно, когда у меня есть только один?
Я пока не совсем понимаю всю внутреннюю работу этого синтаксиса тегов шаблонов, поэтому у меня есть ощущение, что я где-то допустил логическую ошибку. Любой совет высоко ценится.
Спасибо,
Джо