2013-12-16 2 views
5

Ich versuche, die folgende Vorlage Schnipsel Arbeit zu machen:django Vorlagen: wie eine Variable in das String-Argument für den Einbau-Tag erweitern `url`

<ul> 
    {% for name,label in entries.items %} 
    <li><a href="{% url name %}">{{ label }}</a></li> 
    {% endfor %} 
</ul> 

Wie Sie name ist eine Variable sehen dass ich in Zeichenfolge erweitern muss, bevor es an das integrierte Tag url übergeben wird.

Leider ist die oben genannte Vorlage Schnipsel Ergebnisse in der folgenden Ausnahme:

Exception Type: TemplateSyntaxError 
Exception Value:  
Caught NoReverseMatch while rendering: Reverse for 'name' with arguments '()' and keyword arguments '{}' not found. 

Irgendwelche Ideen oder alternative Methoden, wie dies zu erreichen?

Antwort

2

Code sollte für Django> = 1,4 (IIRC) arbeiten - vorausgesetzt name Wird in einen gültigen URL-Namen aufgelöst und diese URL benötigt keine Argumente oder Kwargs. Für Django 1.3x müssen Sie {% load url from future %} zu Ihrer Vorlage hinzufügen, damit dies funktioniert. Für django < 1.3 haben Sie Pech (na, Sie müssen ein benutzerdefiniertes Tag schreiben) - aber Sie sollten möglicherweise erwägen, Ihren Code trotzdem zu portieren.

+0

Dies ist die Antwort, nach der ich gesucht habe. Es klappt! Vielen Dank! :) (Ich benutze Django 1.3.7) – fstab

3

Sie können die Variable an {% url %} Vorlagentag übergeben. Wenn name gültiger URL-Name ist, sollte dieses Snippet funktionieren.

Wenn Sie name auf einen gültigen URLPATTERN Namen konvertieren müssen, können Sie es tun, indem Sie benutzerdefinierte Filter verwenden, wie folgt aus:

{% url name|my_filter %} 
+0

Danke für die Antwort. Es scheint ein wenig überflüssig zu sein, einen benutzerdefinierten Filter zu erstellen, der nur die Django-URL-Resolver-Funktion aufruft. Deshalb habe ich auf eine Lösung innerhalb der Vorlage gehofft. – fstab

+0

Übrigens enthält 'name' bereits einen gültigen URL-Namen. – fstab

+1

@niekas: die Beispiel-Syntax, die Sie gepostet haben, ist für Filter, nicht für Tags. –