试图解决模板标签的问题。
我有两个模板标签:
@register.inclusion_tag('directory/_alphabet.html')
def alphabet_list(names):
""" Return a list of letters that last names start with. """
return { 'letters': [name.last_name[0] for name in names] }
class NameNode(template.Node):
def __init__(self, letter, var_name):
self.letter = letter
self.var_name = var_name
def render(self, context):
context[self.var_name] = Person.objects.get_active().filter(
last_name__istartswith=self.letter)
return ''
@register.tag
def get_names(parser, token):
try:
tag_name, arg = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires arguments" % \
token.contents.split()[0]
m = re.search(r'for (.*?) as (\w+)', arg)
if not m:
raise template.TemplateSyntaxError, "%r tag had invalid arguments" % \
tag_name
letter, var_name = m.groups()
return NameNode(letter, var_name)
我想像这样使用它们:
{% for letter in letters %}
<h2>{{ letter }}</h2>
{% get_names for letter as names %}
<ul>
{% for name in names %}
<li>{{ name }}</li>
{% endfor %}
</ul>
{% endfor %}
但是“字母”作为单词“字母”而不是变量应该包含的任何字母发送。有没有办法解决这个问题或我缺少的东西(或者,更好的是,一个已经这样做的包)?
最佳答案
你得到字符串 "letter"
因为这是模板解析器从您的模板源中读取的内容。如果要访问该变量的值,必须在NameNode.__init__
中将其标记为模板变量。并使用 render
中的上下文解决它.
如下:
class NameNode(template.Node):
def __init__(self, letter, var_name):
self.letter = template.Variable(letter)
self.var_name = var_name
def render(self, context):
try:
context[self.var_name] = Person.objects.get_active().filter(
last_name__istartswith=self.letter.resolve(context))
except template.VariableDoesNotExist:
pass
return ''
文档中对此进行了解释 here .
关于django - 模板标签中使用的循环变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2624906/