In Django, wie kann ich iterieren das Ergebnis eines benutzerdefinierten Template-Tages, die Argumente erfordert?

StackOverflow https://stackoverflow.com/questions/650986

  •  19-08-2019
  •  | 
  •  

Frage

Wenn ich einen Template-Tag erstellt:

@register.simple_tag
def last_books(a_cat, cutoff=5):
    objects = Books.objects.filter(category=a_cat)
    return objects[:cutoff]

Wie kann ich so etwas in meiner Vorlage:

{% for book in last_books 'Sports' 3 %}

Ich bin derzeit immer diese Fehlermeldung:

  

'für' Angaben sollen das Format 'für x in y' verwenden: für x in last_books 'Sport' 3

War es hilfreich?

Lösung

Persönlich würde ich einfach in dem Buch übergeben als Kontextvariable über die Ansicht. Auf diese Weise haben Sie keine Notwendigkeit für einen Template-Tag.

Alternativ können Sie die inclusion_tag Dekorateur verwenden stattdessen die die Idee hüllt den Rendering eine Vorlage mit einem benutzerdefinierten Kontext in das aktuelle Dokument enthält.

Wenn Sie aber auf dem aktuellen Pfad fortsetzen mögen, ist der simple_tag Dekorateur nicht der Weg zu gehen. Es ist für den Einsatz, wenn Sie einen string zurückkehren müssen, die Sie direkt in die Vorlage gerendert werden sollen. Was Sie versuchen, eine Vorlage Kontextvariable zu tun gesetzt. Das ist ein bisschen mehr beteiligt, aber nicht zu schwer. Erstellen Sie einen Knoten etwas wie folgt aus:

class LastBooksNode(template.Node):
    def __init__(self, category, cutoff=5, var_name='books'):
        self.category = category
        self.cutoff = cutoff
        self.var_name = var_name
    def render(self, context):
        context[self.var_name] = Books.objects.filter(category=self.category)[:self.cutoff]
        return ''

@register.tag(name='last_books')
def do_last_books(parser, token):
    error = False
    try:
        tag_name, category, cutoff, _as, var_name = token.split_contents()
        if _as != 'as':
            error = True
    except:
        error = True

    if error:
        raise TemplateSyntaxError, 'last_books must be of the form, "last_books <category> <cutoff> as <var_name>"'
    else:
        return LastBooksNode(a_cat, cutoff, var_name)

Sie würden dann die Template-Tag aufrufen mit:

{% import <your tag library> %}
{% last_books 'category' 5 as my_books %}
{% for book in my_books %}
    ....
{% endfor %}

Nicht getestet, aber ich hoffe, dass dies die Idee demonstriert. Wie oben erwähnt, aber die Bücher vorbei direkt auf die Ansicht über den Kontext oder mit einem inclusion_tag kann einfacher sein, wenn Sie dies nicht die Absicht, an mehreren Stellen wieder zu verwenden.

Andere Tipps

Warum nicht mit ?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top