2010-03-18 2 views
37

Ich übergebe an Djangos Vorlage eine Funktion, die einige Datensätze zurückgibt. Ich möchte diese Funktion aufrufen und über ihr Ergebnis iterieren.Wie Funktion aufrufen, die ein Argument in einer Django-Vorlage übernimmt?

{% for item in my_func(10) %} 

Das funktioniert nicht. Ich habe versucht, den Rückgabewert der Funktion auf eine Variable zu setzen und über die Variable zu iterieren, aber es scheint keine Möglichkeit zu geben, eine Variable in einer Django-Vorlage zu setzen.

Gibt es einen normalen Weg es zu tun?

Antwort

47

Sie können keine Funktion aufrufen, die Argumente in einer Vorlage benötigt. Write ein Template-Tag oder Filter stattdessen.

+57

Sehr traurig. Ich hätte gerne einen einfacheren Weg. – cleg

+1

Ich denke, die Lösung mit der eingebauten Python '@ Eigenschaft 'ist natürlich die bessere Lösung, abhängig von der Situation. – jrast

+0

ja, aber das löst das Problem nicht. Django ruft automatisch Funktionen auf, wenn sie keine Argumente benötigen.Das Schreiben von '{% für Element in myfunc%}' ist äquivalent zu 'für Element in myfunc()', wenn myfunc eine Funktion ohne Argumente ist. Die einzige wirkliche Einschränkung mit django ist das Aufrufen einer Funktion, die Argumente benötigt, die '' property' 'nicht löst (obwohl Sie zwar einige Attribute in der Vorlage setzen und sie als Argumente verwenden könnten, aber das ist auch nicht besonders sauber) – matts1

8

ich vorbei, eine Funktion zu Djangos Vorlage, die mir einige Datensätze zurückgibt

Warum gehst du nicht zu Django passieren die Variable Speicherfunktion Rückgabewert Vorlage anstelle der Funktion?


Ich habe versucht, über Variablen zu setzen fuction Rückgabewert einer Variablen und laufen, aber es scheint keine Möglichkeit zu geben Variable zu setzen in Django-Vorlage.

Sie sollten Variablen in Django-Ansichten anstelle von Vorlagen festlegen und sie dann an die Vorlage übergeben.

+0

Diese Funktion gibt einige Datensätze zurück und Parameter ist ihre Anzahl. Ich möchte diesen Wert von Vorlage steuern. – cleg

+2

Was ist, wenn Sie möchten, dass die Funktion träge ausgewertet wird? z.B. Sie möchten, dass das Ergebnis bei Bedarf verfügbar ist, aber Sie möchten es nicht umsonst berechnen? Ich denke, ich bin dabei, Template-Tags zu schreiben. – Rob

2

Von Entwurf können Django-Vorlagen nicht in beliebigen Python-Code aufrufen. Dies ist eine Sicherheitsfunktion für Umgebungen, in denen Designer Vorlagen erstellen und die Migration von Geschäftslogik in Vorlagen verhindern.

Wenn Sie dies tun möchten, können Sie zur Verwendung von Jinja2-Vorlagen (http://jinja.pocoo.org/docs/) oder eines anderen Templating-Systems, das Ihnen gefällt, wechseln. Kein anderer Teil von Django wird von den von Ihnen verwendeten Vorlagen beeinflusst, da dies absichtlich ein einseitiger Prozess ist. Sie können sogar viele verschiedene Vorlagensysteme im selben Projekt verwenden, wenn Sie möchten.

15

Wenn Sie ein Objekt haben, können Sie es als definieren, so dass Sie Ergebnisse ohne einen Anruf erhalten können, z.

class Item: 
    @property 
    def results(self): 
     return something 

dann in der Vorlage:

<% for result in item.results %> 
... 
<% endfor %> 
+0

Haben Sie eine Referenz für dieses @sherpya? – bozdoz

+2

Python-integrierte Eigenschaft http://docs.python.org/2/library/functions.html#property – sherpya

+0

Nicht das Gleiche. Die Dinge im Array können verschiedene Objektklassen sein. – kentor

1

Was könnten Sie tun, ist, die „Funktion“ als eine andere Vorlagendatei erstellen und schließen Sie dann die Datei, die Parameter zu es übergeben.

Innen index.html

<h3> Latest Songs </h3> 
{% include "song_player_list.html" with songs=latest_songs %} 

Innen song_player_list.html

<ul> 
{% for song in songs %} 
<li> 
<div id='songtile'> 
<a href='/songs/download/{{song.id}}/'><i class='fa fa-cloud-download'></i>&nbsp;Download</a> 

</div> 
</li> 
{% endfor %} 
</ul> 
+0

Wie kann ich kontrollieren, dass '{% include" song_player_list.html "mit songs = latest_songs%}' nur ausgeführt wird, wenn auf eine Schaltfläche geklickt wird. Ich habe versucht, es in eine Funktion zu setzen, aber 'Django template' führe es jedes Mal aus, wenn ich die Seite lade. –

Verwandte Themen