So generieren Sie URLs in Django
-
09-06-2019 - |
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.
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)
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
).