Che cos'è un errore NoReverseMatch e come posso risolverlo?


119

Ho del codice e quando viene eseguito, genera un NoReverseMatch, dicendo:

NoReverseMatch in / my_url / Reverse per "my_url_name" con argomenti "()" e parole chiave "{}" non trovati. n pattern provati: []

Cosa significa e cosa posso fare al riguardo?

Risposte:


243

L' NoReverseMatcherrore sta dicendo che Django non riesce a trovare un pattern URL corrispondente per l'URL che hai fornito in nessuno degli URL della tua app installata.

L'eccezione NoReverseMatch viene sollevata da django.core.urlresolvers quando un URL corrispondente nel tuo URLconf non può essere identificato in base ai parametri forniti.

Per avviare il debug, è necessario iniziare eliminando il messaggio di errore fornito.

  • NoReverseMatch in / my_url /

    Questoèl'URL attualmente in fase di rendering, è questo URL a cui la tua applicazione sta attualmente tentando di accedere ma contiene un URL che non può essere trovato

  • Inverti per "my_url_name"

    Questo è il nome dell'URL che non riesce a trovare

  • con argomenti '()' e

    Questi sono gli argomenti non basati su parole chiave che fornisce all'URL

  • argomenti della parola chiave "{}" non trovati.

    Questi sono gli argomenti delle parole chiave che fornisce all'URL

  • n pattern provati: []

    Questi sono i modelli che è stato in grado di trovare nei tuoi file urls.py con cui ha cercato di confrontarsi

Inizia individuando il codice nella tua fonte pertinente all'URL attualmente in fase di rendering: l'URL, la vista e tutti i modelli coinvolti. Nella maggior parte dei casi, questa sarà la parte del codice che stai attualmente sviluppando.

Dopo averlo fatto, leggi il codice nell'ordine in cui django seguirà fino a raggiungere la riga di codice che sta cercando di costruire un URL per il tuo my_url_name. Di nuovo, questo è probabilmente in un posto che hai cambiato di recente.

Ora che hai scoperto dove si è verificato l'errore, utilizza le altre parti del messaggio di errore per risolvere il problema.

Il nome dell'URL

  • Ci sono errori di battitura?
  • Hai fornito l'URL a cui stai tentando di accedere al nome dato?
  • Se si dispone di app_name impostato nella app urls.py(ad esempio app_name = 'my_app') o se hai incluso l'applicazione con uno spazio dei nomi (per esempio include('myapp.urls', namespace='myapp'), allora avete bisogno di includere il namespace durante la retromarcia, ad esempio {% url 'myapp:my_url_name' %}o reverse('myapp:my_url_name').

Argomenti e argomenti delle parole chiave

Gli argomenti e gli argomenti delle parole chiave vengono utilizzati per eseguire la corrispondenza con qualsiasi gruppo di acquisizione presente all'interno dell'URL dato che può essere identificato dalle ()parentesi quadre nel pattern dell'URL.

Supponendo che l'URL che stai abbinando richieda argomenti aggiuntivi, dai un'occhiata al messaggio di errore e prima controlla se il valore per gli argomenti forniti sembra essere corretto.

Se non sono corretti:

  • Il valore è mancante o una stringa vuota

    Ciò significa generalmente che il valore che stai trasmettendo non contiene il valore che ti aspetti che sia. Dai un'occhiata a dove gli assegni il valore, imposta i punti di interruzione e avrai bisogno di capire perché questo valore non viene passato correttamente.

  • L'argomento della parola chiave ha un errore di battitura

    Correggilo nel pattern URL o nell'URL che stai costruendo.

Se sono corrette:

  • Esegui il debug della regex

    Puoi utilizzare un sito Web come regexr per verificare rapidamente se il tuo pattern corrisponde all'URL che pensi di creare, copia il pattern URL nel campo regex in alto, quindi utilizza l'area di testo per includere gli URL che ritieni siano dovrebbe corrispondere a.

    Errori comuni:

    • Corrispondenza con il .carattere jolly o qualsiasi altro carattere regex

      Ricorda di eseguire l'escape dei caratteri specifici con un \prefisso

    • Solo corrispondenza con caratteri minuscoli / maiuscoli

      Prova a utilizzare a-Zo al \wposto di a-zoA-Z

  • Verifica che il modello che stai cercando sia incluso nei modelli provati

    Se non è qui, è possibile che tu abbia dimenticato di includere la tua app all'interno INSTALLED_APPSdell'impostazione (o INSTALLED_APPSpotrebbe essere necessario esaminare l'ordine delle app all'interno )

Versione Django

In Django 1.10, la possibilità di invertire un URL tramite il suo percorso python è stata rimossa. Al suo posto dovrebbe essere utilizzato il percorso denominato.


Se non sei ancora in grado di rintracciare il problema, sentiti libero di porre una nuova domanda che includa ciò che hai provato, ciò che hai ricercato (puoi collegarti a questa domanda) e quindi includere il codice pertinente al problema: l'URL che stai cercando di trovare, eventuali pattern URL rilevanti, la parte del messaggio di errore che mostra ciò che django ha cercato di abbinare e possibilmente l' INSTALLED_APPSimpostazione, se applicabile.


11
Finalmente abbiamo una risposta canonica che possiamo fornire come obiettivo
duplice

puoi approfondire il percorso denominato in django 1.10?
sage poudel

2
Sì, set app_name in the app's urls.py (e.g. app_name = 'my_app') è il punto
CK

Trovo questo tester regex live più utile: regex101.com
obotezat

Grazie per questo fantastico tutorial su NoReverseMatch! Sono stato in grado di risolvere il mio problema.
newmachines_xyz

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.