¿Cómo uso django.core.urlresolvers.reverse con una referencia de función en lugar de un patrón de URL con nombre?
Pregunta
En mi archivo urls.py
, tengo:
from myapp import views
...
(r'^categories/
Donde categories
es una función de vista dentro de myapp / views.py
. Ninguna otra línea de URLconf hace referencia a views.categories
.
En un archivo de prueba de unidad, estoy intentando capturar esta URL usando django.core.urlresolvers.reverse ()
, en lugar de simplemente copiar '/ categories /' (DRY y todo eso) . Entonces, tengo:
from django.core.urlresolvers import reverse
from myapp import views
...
url = reverse(views.categories)
Cuando ejecuto mis pruebas, obtengo el error NoReverseMatch
:
NoReverseMatch: Reverse for '<function categories at 0x1082f30>' with arguments '()' and keyword arguments '{}' not found.
Coincide perfectamente si hago que el patrón de URL sea un patrón con nombre, como este:
url(r'^categories/
Y usa el nombre del patrón para que coincida:
url = reverse('myapp-categories')
Pero por lo que puedo ver en the reverse
documentación , no debería tener que convertirlo en un patrón de URL con nombre solo para utilizar reverse
.
¿Alguna idea de lo que estoy haciendo mal?
, views.categories)
Donde categories
es una función de vista dentro de myapp / views.py
. Ninguna otra línea de URLconf hace referencia a views.categories
.
En un archivo de prueba de unidad, estoy intentando capturar esta URL usando django.core.urlresolvers.reverse ()
, en lugar de simplemente copiar '/ categories /' (DRY y todo eso) . Entonces, tengo:
<*>
Cuando ejecuto mis pruebas, obtengo el error NoReverseMatch
:
<*>
Coincide perfectamente si hago que el patrón de URL sea un patrón con nombre, como este:
<*>
Y usa el nombre del patrón para que coincida:
<*>
Pero por lo que puedo ver en the reverse
documentación , no debería tener que convertirlo en un patrón de URL con nombre solo para utilizar reverse
.
¿Alguna idea de lo que estoy haciendo mal?
, views.categories, 'myapp-categories')
Y usa el nombre del patrón para que coincida:
<*> Pero por lo que puedo ver en the reverse
documentación , no debería tener que convertirlo en un patrón de URL con nombre solo para utilizar reverse
.
¿Alguna idea de lo que estoy haciendo mal?
, views.categories) Donde categories
es una función de vista dentro de myapp / views.py
. Ninguna otra línea de URLconf hace referencia a views.categories
.
En un archivo de prueba de unidad, estoy intentando capturar esta URL usando django.core.urlresolvers.reverse ()
, en lugar de simplemente copiar '/ categories /' (DRY y todo eso) . Entonces, tengo:
Cuando ejecuto mis pruebas, obtengo el error NoReverseMatch
:
Coincide perfectamente si hago que el patrón de URL sea un patrón con nombre, como este:
<*>Y usa el nombre del patrón para que coincida:
<*> Pero por lo que puedo ver en the reverse
documentación , no debería tener que convertirlo en un patrón de URL con nombre solo para utilizar reverse
.
¿Alguna idea de lo que estoy haciendo mal?
Solución 2
Después de más investigaciones, resultó que había un problema con la forma en que importaba el módulo de vistas:
¿Cómo puedo pasar? ¿Una referencia de función a la función reverse () de Django?
Gracias por la ayuda, muchachos: me inspiraron a verlo correctamente.
Otros consejos
El ejemplo de Jack M. es casi correcto.
Debe ser una función de URL, no una tupla, si quieres usar URL con nombre.
url(r'^no_monkeys/, 'views.noMonkeys', {}, "no-monkeys"),
Esto funciona, y todo el código que has pegado es correcto y funciona bien (simplemente lo copié en una aplicación de prueba / proyecto limpia e invirtí la URL sin ningún problema). Así que aquí hay algo más que no nos has mostrado. Simplifique los conceptos básicos hasta que funcione, luego comience a agregar complejidad nuevamente y vea dónde se está rompiendo.
También, puedes hacer " ./ manage.py shell " e importe luego de forma interactiva la función inversa y la función de vista y pruebe a la inversa. Eso eliminará la configuración de la prueba como una posible causa.
La función de inversión usa el " nombre " de la URL. Esto se define así:
urlpatterns = patterns('',
(r'^no_monkeys/
Ahora llamarías a reversa con la cadena " no-monkeys " para obtener la url correcta.
Edición de ninja: Aquí hay un enlace a Los documentos de django sobre el tema.
, 'views.noMonkeys', {}, "no-monkeys"),
(r'^admin/(.*)', admin.site.root),
)
Ahora llamarías a reversa con la cadena " no-monkeys " para obtener la url correcta.
Edición de ninja: Aquí hay un enlace a Los documentos de django sobre el tema.