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

119

Tengo algo de código y cuando se ejecuta, lanza un NoReverseMatch, diciendo:

NoReverseMatch en / my_url / Invertir para 'my_url_name' con argumentos '()' y argumentos de palabra clave '{}' no encontrados. n patrón (s) probado: []

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

Sayse
fuente

Respuestas:

243

El NoReverseMatcherror dice que Django no puede encontrar un patrón de URL coincidente para la URL que proporcionó en ninguna de las URL de su aplicación instalada.

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

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

  • NoReverseMatch en / my_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

  • Invertir 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.

  • No se han encontrado los argumentos de palabra clave '{}'.

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

  • n patrón (s) probado: []

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

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

Una vez que hayas hecho esto, lee el código en el orden que seguiría django hasta que llegues a la línea de código que está intentando construir una URL para tu my_url_name. Una vez más, probablemente se encuentre en un lugar que ha cambiado recientemente.

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

El nombre de la URL

  • ¿Hay errores tipográficos?
  • ¿Ha proporcionado la URL con la que está intentando acceder al nombre de pila?
  • Si tiene un juego nombre_apl en la aplicación de urls.py(por ejemplo app_name = 'my_app') o si se incluye la aplicación con un espacio de nombres (por ejemplo include('myapp.urls', namespace='myapp'), entonces es necesario incluir el espacio de nombres al dar marcha atrás, 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 hacer coincidir los grupos de captura que están presentes dentro de la URL dada, que pueden ser identificados por 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 es una cadena vacía

    Esto generalmente 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, establece puntos de interrupción y deberá averiguar por qué este valor no se transfiere 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á creando.

Si son correctos:

  • 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 regex en la parte superior y luego use el área de texto para incluir las URL que crea debe coincidir con.

    Errores comunes:

    • Coincidencia con el .carácter comodín o cualquier otro carácter regex

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

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

      Intente usar a-Zo en \wlugar de a-zoA-Z

  • Verifique que el patrón que está haciendo coincidir esté incluido dentro de los patrones probados

    Si no está aquí, es posible que se haya olvidado de incluir su aplicación en la INSTALLED_APPSconfiguración (o es INSTALLED_APPSposible que deba examinar el orden de las aplicaciones )

Versión de Django

En Django 1.10, se eliminó la capacidad de revertir una URL por su ruta de Python. En su lugar, debe usarse la ruta nombrada.


Si aún no puede localizar el problema, no dude en hacer una nueva pregunta que incluya lo que ha intentado, 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.

dice
fuente
11
Finalmente, tenemos una respuesta canónica que podemos proporcionar como objetivo dup
e4c5
¿Puede explicar la ruta con nombre en django 1.10?
poudel de salvia
2
Sí, set app_name in the app's urls.py (e.g. app_name = 'my_app') es el punto
CK
Encuentro este probador de expresiones
obotezat
¡Gracias por este magnífico tutorial sobre NoReverseMatch! Pude solucionar mi problema.
newmachines_xyz