2008-09-25 7 views
8

En mi archivo urls.py, que tienen:¿Cómo uso django.core.urlresolvers.reverse con una referencia de función en lugar de un patrón de URL con nombre?

from myapp import views 
... 
(r'^categories/$', views.categories) 

Dónde categories es una función de vista en el interior myapp/views.py. Ninguna otra línea de URLconf hace referencia al views.categories.

En un archivo de prueba unitaria, estoy tratando de obtener esta URL usando django.core.urlresolvers.reverse(), en lugar de simplemente copiar '/ categories /' (DRY y todo eso). Por lo tanto, tengo:

from django.core.urlresolvers import reverse 
from myapp import views 
... 

url = reverse(views.categories) 

Cuando ejecuto mis pruebas, me sale un error de NoReverseMatch:

NoReverseMatch: Reverse for '<function categories at 0x1082f30>' with arguments '()' and keyword arguments '{}' not found. 

Se coincide muy bien si hago el patrón de URL de un patrón llamado, así:

url(r'^categories/$', views.categories, 'myapp-categories') 

Y utilizar el nombre del patrón de igualar:

url = reverse('myapp-categories') 

Pero por lo que puedo decir de the reverse documentation, no debería necesitar convertirlo en un patrón de URL con nombre solo para usar reverse.

¿Alguna idea de lo que estoy haciendo mal?

+0

La documentación inversa indica que debe usar URL con nombre o pasar el nombre de la función utilizada en su URLconf, y se puede pasar como una cadena.Por lo tanto, conviértalo en una URL con nombre o usa "views.categories". – camflan

+0

La última documentación dice que el nombre de la vista es "una referencia de función o la versión de cadena del nombre", por lo que no debería ser una cadena:

Respuesta

-1

La función inversa realmente utiliza el "nombre" de la URL. Esto se define así:

urlpatterns = patterns('', 
    (r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"), 
    (r'^admin/(.*)', admin.site.root), 
) 

Ahora que llamarían inversa con la cadena "no-monos" Obtenga la dirección correcta.

Ninja Editar: Here is a link a los documentos django sobre el tema.

+0

Claro, parece funcionar bien si uso patrones de URL con nombre. Pero creo que debería funcionar solo con una referencia de función. Como nota al margen, creo que debe usar la función URL en lugar de solo una tupla para crear un patrón URL llamado, por ejemplo, url (r '^ no_monkeys/$', 'views.noMonkeys', {}, "no -monkeys ") –

+0

Sí, necesita llamar a' la función url() 'para usar las URL nombradas, como ya he indicado. http://stackoverflow.com/questions/134629/how-do-i-use-djangocoreurlresolversreverse-with-a-function-reference-instead-of#136721 – camflan

+0

Y, 'name' es un argumento de palabra clave y debe estar firmado como tal. – camflan

0

Esto funciona, y todo el código que ha pegado es correcto y funciona bien (simplemente lo copié en una aplicación de prueba/proyecto limpia e invirtió la URL sin ningún problema). Aquí hay algo más que no nos has enseñado. Simplifique hasta lo básico hasta que funcione, luego comience a agregar complejidad nuevamente y vea dónde se está rompiendo.

Además, puede hacer "./manage.py shell" y luego importar de forma interactiva la función inversa y su función de vista e intente al revés. Eso eliminará la configuración de prueba como una posible causa.

+0

Tiene toda la razón: soy un poco nuevo en la programación, con tanta frecuencia me olvido de los pasos adecuados para la solución de problemas. Aunque es extraño, he creado un nuevo proyecto vacío de una sola aplicación, he pegado el código y tampoco puedo hacerlo funcionar allí. Voy a tocar un poco más. –

2

El ejemplo de Jack M. es casi correcto.

Tiene que ser una función url, no una tupla, si desea usar URL con nombre.

url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"), 
Cuestiones relacionadas