In Django, wie kann ich iterieren das Ergebnis eines benutzerdefinierten Template-Tages, die Argumente erfordert?
-
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
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 ?