Für die in Templatetag verwendete Schleifenvariable?
-
26-09-2019 - |
Frage
Versuch, ein Problem mit Templatetags zu lösen.
Ich habe zwei Templatetags:
@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)
Und ich möchte sie so verwenden:
{% for letter in letters %}
<h2>{{ letter }}</h2>
{% get_names for letter as names %}
<ul>
{% for name in names %}
<li>{{ name }}</li>
{% endfor %}
</ul>
{% endfor %}
Aber 'Brief' wird als Wort "Brief" gesendet und nicht als Buchstaben, den die Variable enthalten sollte. Gibt es einen Weg um dieses oder etwas, das mir fehlt (oder besser noch ein Paket, das dies bereits tut)?
Lösung
Sie erhalten die Zeichenfolge "letter"
Denn dies ist das, was der Vorlage Parser aus Ihrer Vorlagenquelle las. Wenn Sie auf den Wert dieser Variablen zugreifen möchten, müssen Sie ihn als Vorlagenvariable in markieren NameNode.__init__
und beschließen es verwendet den Kontext in render
.
Wie folgt:
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 ''
Es wird in den Dokumenten erklärt hier.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow