Co to jest błąd NoReverseMatch i jak go naprawić?

119

Mam trochę kodu i kiedy jest wykonywany, rzuca NoReverseMatch, mówiąc:

Nie znaleziono NoReverseMatch at / my_url / Reverse dla „my_url_name” z argumentami „()” i słowami kluczowymi „{}”. n wypróbowanych wzorów: []

Co to oznacza i co mogę z tym zrobić?

Powiedz
źródło

Odpowiedzi:

243

NoReverseMatchBłędu mówiąc, że Django nie można znaleźć wzór pasujący URL url masz przewidzianego w którymkolwiek z adresów URL zainstalowanych aplikacji.

Wyjątek NoReverseMatch jest zgłaszany przez django.core.urlresolvers, gdy nie można zidentyfikować pasującego adresu URL w konfiguracji adresu URL na podstawie podanych parametrów.

Aby rozpocząć debugowanie, musisz zacząć od sprawdzenia otrzymanego komunikatu o błędzie.

  • NoReverseMatch pod adresem / my_url /

    To jest aktualnie renderowany adres URL, jest to adres URL, do którego aplikacja próbuje uzyskać dostęp, ale zawiera adres URL, którego nie można dopasować

  • Odwróć dla „my_url_name”

    To jest nazwa adresu URL, którego nie może znaleźć

  • z argumentami „()” i

    To są argumenty niebędące słowami kluczowymi, które dostarcza do adresu URL

  • Nie znaleziono argumentów słów kluczowych „{}”.

    To są argumenty słów kluczowych, które dostarcza do adresu URL

  • n wypróbowanych wzorów: []

    Oto wzorce, które udało mu się znaleźć w plikach urls.py, z którymi próbował dopasować

Zacznij od zlokalizowania kodu w źródle odpowiedniego dla aktualnie renderowanego adresu URL - adresu URL, widoku i wszelkich powiązanych szablonów. W większości przypadków będzie to część kodu, nad którą obecnie pracujesz.

Gdy już to zrobisz, przeczytaj kod w kolejności, w jakiej django będzie podążać, aż dojdziesz do wiersza kodu, który próbuje utworzyć adres URL dla twojego my_url_name. Ponownie, jest to prawdopodobnie miejsce, które niedawno zmieniłeś.

Teraz, gdy już wiesz, gdzie występuje błąd, użyj innych części komunikatu o błędzie, aby rozwiązać problem.

Nazwa adresu URL

  • Czy są jakieś literówki?
  • Czy podałeś adres URL, do którego próbujesz uzyskać dostęp do podanej nazwy?
  • Jeśli ustawiłeś app_name w aplikacji urls.py(np. app_name = 'my_app') Lub jeśli dołączyłeś aplikację z przestrzenią nazw (np. include('myapp.urls', namespace='myapp')Wtedy musisz uwzględnić przestrzeń nazw podczas cofania, np . {% url 'myapp:my_url_name' %}Lub reverse('myapp:my_url_name').

Argumenty i argumenty słów kluczowych

Argumenty i argumenty słów kluczowych są używane w celu dopasowania do wszelkich grup przechwytywania, które są obecne w podanym adresie URL, które można zidentyfikować za pomocą otaczających ()nawiasów we wzorcu adresu URL.

Zakładając, że pasujący adres URL wymaga dodatkowych argumentów, spójrz na komunikat o błędzie i najpierw sprawdź, czy wartości podanych argumentów wyglądają na poprawne.

Jeśli nie są poprawne:

  • Brak wartości lub pusty ciąg

    Zwykle oznacza to, że wartość, którą przekazujesz, nie zawiera wartości, której się spodziewasz. Przyjrzyj się, gdzie przypisujesz jej wartość, ustaw punkty przerwania, a będziesz musiał dowiedzieć się, dlaczego ta wartość nie jest poprawnie przekazywana.

  • Argument słowa kluczowego zawiera literówkę

    Popraw to we wzorcu adresu URL lub w konstruowanym adresie URL.

Jeśli są poprawne:

  • Debuguj wyrażenie regularne

    Możesz użyć strony internetowej, takiej jak regexr, aby szybko sprawdzić, czy wzorzec pasuje do adresu URL, który Twoim zdaniem tworzysz, Skopiuj wzorzec adresu URL do pola wyrażenia regularnego u góry, a następnie użyj obszaru tekstowego, aby uwzględnić adresy URL, które uważasz za stosowne powinien pasować do.

    Typowe błędy:

    • Dopasowanie do .znaku wieloznacznego lub innych znaków wyrażenia regularnego

      Pamiętaj, aby uciec przed określonymi znakami \przedrostkiem

    • Dopasowywanie tylko do małych / dużych liter

      Spróbuj użyć albo a-Zalbo \wzamiast a-zalboA-Z

  • Sprawdź, czy pasujący wzorzec znajduje się w wypróbowanych wzorcach

    Jeśli go tu nie ma, możliwe, że zapomniałeś uwzględnić swoją aplikację w INSTALLED_APPSustawieniach (lub kolejność aplikacji INSTALLED_APPSmoże wymagać sprawdzenia)

Wersja Django

W Django 1.10 usunięto możliwość odwrócenia adresu URL za pomocą jego ścieżki w języku Python. Zamiast tego należy użyć nazwanej ścieżki.


Jeśli nadal nie jesteś w stanie wyśledzić problemu, możesz zadać nowe pytanie, które zawiera informacje o tym, co próbowałeś, czego szukałeś (możesz zamieścić link do tego pytania), a następnie dołączyć odpowiedni kod do problem - adres URL, który dopasowujesz, wszelkie odpowiednie wzorce adresów URL, część komunikatu o błędzie, która pokazuje, co django próbował dopasować i prawdopodobnie INSTALLED_APPSustawienie, jeśli ma zastosowanie.

Powiedz
źródło
11
W końcu mamy kanoniczną odpowiedź, którą możemy podać jako cel
dupcia
czy możesz rozwinąć nazwaną ścieżkę w django 1.10?
sage poudel
2
Tak, o set app_name in the app's urls.py (e.g. app_name = 'my_app') to chodzi
CK
Uważam, że ten tester regex na żywo jest bardziej pomocny: regex101.com
obotezat
Dziękuję za ten wspaniały samouczek dotyczący NoReverseMatch! Udało mi się rozwiązać mój problem.
newmachines_xyz