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

War es hilfreich?

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
scroll top