Was ist ein NoReverseMatch-Fehler und wie behebe ich ihn?

119

Ich habe Code und wenn er ausgeführt wird, wird ein NoReverseMatch ausgelöst, der sagt:

NoReverseMatch at / my_url / Reverse für 'my_url_name' mit Argumenten '()' und Schlüsselwortargumenten '{}' nicht gefunden. n Muster versucht: []

Was bedeutet das und was kann ich dagegen tun?

Sayse
quelle

Antworten:

243

Der NoReverseMatchFehler besagt, dass Django kein passendes URL-Muster für die URL finden kann, die Sie in einer der URLs Ihrer installierten App angegeben haben.

Die NoReverseMatch-Ausnahme wird von django.core.urlresolvers ausgelöst, wenn eine übereinstimmende URL in Ihrer URLconf anhand der angegebenen Parameter nicht identifiziert werden kann.

Um mit dem Debuggen zu beginnen, müssen Sie zunächst die Fehlermeldung entfernen, die Sie erhalten haben.

  • NoReverseMatch unter / my_url /

    Dies ist die URL, die gerade gerendert wird. Es ist diese URL, auf die Ihre Anwendung derzeit zugreifen möchte, die jedoch eine nicht übereinstimmende URL enthält

  • Umkehren für 'my_url_name'

    Dies ist der Name der URL, die nicht gefunden werden kann

  • mit den Argumenten '()' und

    Dies sind die Nicht-Schlüsselwort-Argumente, die der URL zur Verfügung gestellt werden

  • Schlüsselwortargumente '{}' nicht gefunden.

    Dies sind die Schlüsselwortargumente, die der URL zur Verfügung gestellt werden

  • n Muster versucht: []

    Dies sind die Muster, die es in Ihren urls.py-Dateien finden konnte, mit denen es übereinstimmen wollte

Suchen Sie zunächst den Code in Ihrer Quelle, der für die aktuell gerenderte URL relevant ist - die URL, die Ansicht und alle beteiligten Vorlagen. In den meisten Fällen ist dies der Teil des Codes, den Sie gerade entwickeln.

Sobald Sie dies getan haben, in der Reihenfolge durch den Code gelesen , dass django würde folgende , bis Sie die Codezeile erreichen , die für Ihr eine URL zu konstruieren versucht my_url_name. Auch dies ist wahrscheinlich an einem Ort, den Sie kürzlich geändert haben.

Nachdem Sie festgestellt haben, wo der Fehler auftritt, können Sie das Problem anhand der anderen Teile der Fehlermeldung beheben.

Der URL-Name

  • Gibt es Tippfehler?
  • Haben Sie die URL angegeben, mit der Sie auf den angegebenen Namen zugreifen möchten?
  • Wenn Sie app_name in der App festgelegt haben urls.py(z. B. app_name = 'my_app') oder wenn Sie die App in einen Namespace eingefügt haben (z. B. include('myapp.urls', namespace='myapp'), müssen Sie den Namespace beim Umkehren einschließen, z . B. {% url 'myapp:my_url_name' %}oder reverse('myapp:my_url_name').

Argumente und Schlüsselwortargumente

Die Argumente und Schlüsselwortargumente werden verwendet, um mit allen Erfassungsgruppen übereinzustimmen, die in der angegebenen URL vorhanden sind und durch die umgebenden ()Klammern im URL-Muster identifiziert werden können .

Angenommen, die URL, mit der Sie übereinstimmen, erfordert zusätzliche Argumente. Sehen Sie sich die Fehlermeldung an und prüfen Sie zunächst, ob der Wert für die angegebenen Argumente korrekt ist.

Wenn sie nicht korrekt sind:

  • Der Wert fehlt oder eine leere Zeichenfolge

    Dies bedeutet im Allgemeinen, dass der Wert, den Sie übergeben, nicht den erwarteten Wert enthält. Sehen Sie sich an, wo Sie den Wert dafür zuweisen, Haltepunkte setzen und herausfinden müssen, warum dieser Wert nicht korrekt übergeben wird.

  • Das Schlüsselwortargument hat einen Tippfehler

    Korrigieren Sie dies entweder im URL-Muster oder in der URL, die Sie erstellen.

Wenn sie richtig sind:

  • Debuggen Sie den regulären Ausdruck

    Sie können eine Website wie regexr verwenden, um schnell zu testen, ob Ihr Muster mit der URL übereinstimmt, die Sie erstellen möchten. Kopieren Sie das URL-Muster in das Regex-Feld oben und verwenden Sie dann den Textbereich, um alle URLs einzuschließen, die Sie für möglich halten sollte gegen passen.

    Häufige Fehler:

    • Übereinstimmung mit dem .Platzhalterzeichen oder anderen Regex-Zeichen

      Denken Sie daran, die spezifischen Zeichen mit einem \Präfix zu maskieren

    • Nur Übereinstimmung mit Klein- / Großbuchstaben

      Versuchen Sie es mit entweder a-Zoder \wanstelle von a-zoderA-Z

  • Überprüfen Sie, ob das Muster, mit dem Sie übereinstimmen, in den getesteten Mustern enthalten ist

    Wenn dies nicht der Fall ist, haben Sie möglicherweise vergessen, Ihre App in die INSTALLED_APPSEinstellung aufzunehmen (oder die Reihenfolge der Apps muss INSTALLED_APPSmöglicherweise überprüft werden).

Django Version

In Django 1.10 wurde die Möglichkeit, eine URL über ihren Python-Pfad umzukehren, entfernt. Der benannte Pfad sollte stattdessen verwendet werden.


Wenn Sie das Problem immer noch nicht finden können, können Sie eine neue Frage stellen, die enthält, was Sie versucht haben, was Sie recherchiert haben (Sie können auf diese Frage verlinken), und dann den entsprechenden Code in das Problem einfügen Problem - die URL, mit der Sie übereinstimmen, alle relevanten URL-Muster, der Teil der Fehlermeldung, der anzeigt, was Django versucht hat, zu finden, und möglicherweise die INSTALLED_APPSEinstellung, falls zutreffend.

Sayse
quelle
11
Schließlich haben wir eine kanonische Antwort, die wir als Dup-Ziel
bereitstellen können
Können Sie bitte den benannten Pfad in Django 1.10 erläutern?
Salbei Poudel
2
Ja, set app_name in the app's urls.py (e.g. app_name = 'my_app') ist der Punkt
CK
Ich finde diesen Live-Regex-Tester hilfreicher: regex101.com
obotezat
Vielen Dank für dieses großartige Tutorial zu NoReverseMatch! Ich konnte mein Problem lösen.
newmachines_xyz
1

Und stellen Sie sicher, dass Ihre Route in der Liste der Routen enthalten ist:

./manage.py show_urls | grep path_or_name

https://github.com/django-extensions/django-extensions

Daniil Mashkin
quelle
1
﹣1 show_urlsist keine Django-Funktion, dies beantwortet die Frage nicht.
Urda