2008-09-04 32 views
24

En el lenguaje de plantillas de Django, puede usar {% url [viewname] [args] %} para generar una URL para una vista específica con parámetros. ¿Cómo puede hacer programáticamente lo mismo en el código de Python?Cómo generar URL en django

Lo que necesito es crear una lista de elementos de menú donde cada elemento tenga nombre, URL y un indicador activo (ya sea que se trate de la página actual o no). Esto se debe a que será mucho más limpio hacer esto en Python que el lenguaje de plantilla.

Respuesta

34

Si necesita usar algo similar a la etiqueta de plantilla {% url %} en su código, Django proporciona el django.core.urlresolvers.reverse(). La función reverse tiene la siguiente firma:

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

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

8

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 puede 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)]) 
+0

¿Es esto lo mismo que usar el decorador? @ models.permalink –

4

Tenga en cuenta que el uso de reverse() requiere que su módulo de URLconf es% de error 100 libre y puede ser procesado - OIA sin ViewDoesNotExist errores o menos, u obtienes la temida excepción NoReverseMatch (los errores en las plantillas suelen fallar silenciosamente y dan como resultado None).