¿Cómo uso django.core.urlresolvers.reverse con una referencia de función en lugar de un patrón de URL con nombre?

StackOverflow https://stackoverflow.com/questions/134629

  •  02-07-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top