Cómo generar URL en Django
-
09-06-2019 - |
Pregunta
En el lenguaje de plantilla de Django, puedes usar {% url [viewname] [args] %}
para generar una URL a una vista específica con parámetros.¿Cómo se puede hacer lo mismo mediante programación en el código Python?
Lo que necesito es crear una lista de elementos del menú donde cada elemento tenga un nombre, una URL y una bandera activa (ya sea la página actual o no).Esto se debe a que será mucho más limpio hacer esto en Python que en el lenguaje de plantilla.
Solución
Si necesita utilizar algo similar a {% url %}
etiqueta de plantilla en su código, Django proporciona la django.core.urlresolvers.reverse()
.El reverse
La función tiene la siguiente firma:
reverse(viewname, urlconf=None, args=None, kwargs=None)
Otros consejos
Estoy usando dos enfoques diferentes en mi models.py
.El primero es el permalink
decorador:
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)
También puedes llamar reverse
directamente:
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)])
Tenga en cuenta que usar reverse()
requiere que su módulo urlconf esté 100% libre de errores y pueda procesarse - iow no ViewDoesNotExist
errores más o menos, o obtienes el temido NoReverseMatch
excepción (los errores en las plantillas generalmente fallan silenciosamente, lo que resulta en None
).