¿Qué es un error NoReverseMatch y cómo lo soluciono?

Resuelto Sayse asked hace 8 años • 6 respuestas

Tengo un código y cuando se ejecuta, arroja un NoReverseMatch que dice:

NoReverseMatch en /my_url/ Inverso para 'my_url_name' con argumentos '()' y argumentos de palabras clave '{}' no encontrados. n patrones probados: []

¿Qué significa esto y qué puedo hacer al respecto?

Sayse avatar Jul 15 '16 14:07 Sayse
Aceptado

El NoReverseMatcherror dice que Django no puede encontrar un patrón de URL coincidente para la URL que proporcionaste en cualquiera de las URL de tu aplicación instalada.

Django.core.urlresolvers genera la excepción NoReverseMatch cuando no se puede identificar una URL coincidente en su URLconf según los parámetros proporcionados.

Para comenzar a depurarlo, debe comenzar analizando el mensaje de error que se le proporcionó.

  • NoReverseMatch en /mi_url/

    Esta es la URL que se está procesando actualmente, es esta URL a la que su aplicación está intentando acceder actualmente pero contiene una URL que no puede coincidir.

  • Inverso para 'my_url_name'

    Este es el nombre de la URL que no puede encontrar.

  • con argumentos '()' y

    Estos son los argumentos que no son palabras clave que proporciona a la URL

  • Argumentos de palabras clave '{}' no encontrados.

    Estos son los argumentos de palabras clave que proporciona a la URL.

  • n patrones probados: []

    Estos son los patrones que pudo encontrar en sus archivos urls.py con los que intentó comparar

Comience ubicando el código en su fuente relevante para la URL que se está representando actualmente: la URL, la vista y cualquier plantilla involucrada. En la mayoría de los casos, esta será la parte del código que estás desarrollando actualmente.

Una vez que haya hecho esto, lea el código en el orden que seguiría Django hasta llegar a la línea de código que intenta construir una URL para su archivo my_url_name. Nuevamente, esto probablemente esté en un lugar que haya cambiado recientemente.

Ahora que ha descubierto dónde se produce el error, utilice las otras partes del mensaje de error para solucionar el problema.

El nombre de la URL

  • ¿Hay algún error tipográfico?
  • ¿Ha proporcionado la URL a la que intenta acceder con el nombre de pila?
  • Si configuró app_name en la aplicación urls.py(por ejemplo app_name = 'my_app'), o si incluyó la aplicación con un espacio de nombres (por ejemplo include('myapp.urls', namespace='myapp'), entonces debe incluir el espacio de nombres al revertir, por ejemplo, {% url 'myapp:my_url_name' %}o reverse('myapp:my_url_name').

Argumentos y argumentos de palabras clave

Los argumentos y los argumentos de palabras clave se utilizan para compararlos con cualquier grupo de captura que esté presente dentro de la URL dada y que pueda identificarse mediante los ()corchetes circundantes en el patrón de URL.

Suponiendo que la URL que está buscando requiere argumentos adicionales, eche un vistazo al mensaje de error y primero observe si el valor de los argumentos dados parece ser correcto.

Si no son correctos:

  • Falta el valor o hay una cadena vacía

    Generalmente, esto significa que el valor que está pasando no contiene el valor que espera que sea. Eche un vistazo a dónde le asigna el valor, establezca puntos de interrupción y deberá descubrir por qué este valor no se transmite correctamente.

  • El argumento de la palabra clave tiene un error tipográfico.

    Corrija esto en el patrón de URL o en la URL que está construyendo.

Si son correctas:

  • Depurar la expresión regular

    Puede usar un sitio web como regexr para probar rápidamente si su patrón coincide con la URL que cree que está creando. Copie el patrón de URL en el campo de expresiones regulares en la parte superior y luego use el área de texto para incluir cualquier URL que crea. debe coincidir con.

    Errores comunes:

    • Coincidencia con el .carácter comodín o cualquier otro carácter de expresión regular

      Recuerde escapar de los caracteres específicos con un \prefijo.

    • Solo coincide con caracteres en minúsculas/mayúsculas

      Intente usar a-Zo \wen lugar de a-zoA-Z

  • Comprueba que el patrón que estás combinando esté incluido entre los patrones probados.

    Si no está aquí, entonces es posible que haya olvidado incluir su aplicación dentro de la configuración (o es posible que sea necesario revisar INSTALLED_APPSel orden de las aplicaciones )INSTALLED_APPS

Versión Django

En Django 1.10, se eliminó la capacidad de invertir una URL según su ruta de Python. En su lugar, se debe utilizar la ruta nombrada.


Si aún no puede localizar el problema, no dude en hacer una nueva pregunta que incluya lo que ha probado, lo que ha investigado (puede vincular a esta pregunta) y luego incluya el código relevante en el problema: la URL que está haciendo coincidir, cualquier patrón de URL relevante, la parte del mensaje de error que muestra lo que Django intentó hacer coincidir y posiblemente la INSTALLED_APPSconfiguración, si corresponde.

Sayse avatar Jul 15 '2016 07:07 Sayse

Tenga cuidado con los diferentes argumentos que pasan entre revertir() y redireccionar(), por ejemplo:

url(r"^some_app/(?P<some_id>\d+)/$", some_view_function, name="some_view")

trabajará con:

reverse("some_view", kwargs={"some_id": my_id})

y:

redirect("some_view", some_id=my_id)

pero no con:

reverse("some_view", some_id=my_id)

y:

redirect("some_view", kwargs={"some_id": my_id})
Laurent Lyaudet avatar Nov 17 '2022 10:11 Laurent Lyaudet

Un error muy común es cuando obtienes with arguments ('',). Esto es causado por algo como esto:

{% url 'view-name' does_not_exist %}

Como does_not_existno existe, Django lo evalúa como una cadena vacía, lo que provoca este mensaje de error.

Si instala django-fastdev (que desarrollo y mantengo), obtendrá un bonito error que indicará que does_not_existno existe, que es el verdadero problema.

boxed avatar Feb 17 '2022 07:02 boxed