Frage

In der Vorlagensprache von Django können Sie Folgendes verwenden {% url [viewname] [args] %} um eine URL zu einer bestimmten Ansicht mit Parametern zu generieren.Wie können Sie dasselbe programmatisch in Python-Code tun?

Was ich brauche, ist, eine Liste von Menüelementen zu erstellen, in der jedes Element einen Namen, eine URL und ein aktives Flag hat (unabhängig davon, ob es sich um die aktuelle Seite handelt oder nicht).Dies liegt daran, dass dies in Python viel sauberer ist als in der Vorlagensprache.

War es hilfreich?

Lösung

Wenn Sie etwas Ähnliches verwenden müssen {% url %} Template-Tag in Ihrem Code, Django stellt das bereit django.core.urlresolvers.reverse().Der reverse Die Funktion hat die folgende Signatur:

reverse(viewname, urlconf=None, args=None, kwargs=None)

https://docs.djangoproject.com/en/dev/ref/urlresolvers/

Andere Tipps

Ich verwende zwei verschiedene Ansätze in meinem models.py.Das erste ist das permalink Dekorateur:

from django.db.models import permalink

def get_absolute_url(self): 
    """Construct the absolute URL for this Item."""
    return ('project.app.views.view_name', [str(self.id)])
get_absolute_url = permalink(get_absolute_url)

Sie können auch anrufen reverse direkt:

from django.core.urlresolvers import reverse

def get_absolute_url(self): 
    """Construct the absolute URL for this Item."""
    return reverse('project.app.views.view_name', None, [str(self.id)])

Seien Sie sich der Verwendung bewusst reverse() erfordert, dass Ihr URLCONF-Modul 100 % fehlerfrei ist und verarbeitet werden kann – iow nein ViewDoesNotExist Fehler oder so, oder Sie bekommen das Gefürchtete NoReverseMatch Ausnahme (Fehler in Vorlagen schlagen normalerweise stillschweigend fehl und führen zu None).

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