Wat is een NoReverseMatch-fout en hoe los ik deze op?

Ik heb wat code en wanneer het wordt uitgevoerd, genereert het een NoReverseMatch en zegt:

NoReverseMatch op /my_url/ Reverse voor ‘my_url_name’ met argumenten ‘()’ en trefwoordargumenten ‘{}’ niet gevonden. n patroon(en) geprobeerd: []

Wat betekent dit en wat kan ik eraan doen?


Antwoord 1, autoriteit 100%

De NoReverseMatch-fout is zegt dat Django geen overeenkomend url-patroon kan vinden voor de url die u heeft opgegeven in de URL’s van uw geïnstalleerde app.

De NoReverseMatch-uitzondering wordt gegenereerd door django.core.urlresolvers wanneer een overeenkomende URL in uw URLconf niet kan worden geïdentificeerd op basis van de opgegeven parameters.

Om te beginnen met debuggen, moet je beginnen met het ontleden van de foutmelding die je hebt gekregen.

  • NoReverseMatch op /my_url/

    Dit is de url die momenteel wordt weergegeven. Het is deze url die uw toepassing momenteel probeert te openen, maar deze bevat een url die niet kan worden gematcht

  • Omgekeerd voor ‘my_url_name’

    Dit is de naam van de url die het niet kan vinden

  • met argumenten ‘()’ en

    Dit zijn de niet-trefwoordargumenten die het aan de url geeft

  • zoekwoordargumenten ‘{}’ niet gevonden.

    Dit zijn de sleutelwoordargumenten die het aan de url geeft

  • n patroon(en) geprobeerd: []

    Dit zijn de patronen die het kon vinden in uw urls.py-bestanden waarmee het probeerde te matchen

Begin met het vinden van de code in uw bron die relevant is voor de url die momenteel wordt weergegeven – de url, de weergave en alle betrokken sjablonen. In de meeste gevallen is dit het deel van de code dat u momenteel aan het ontwikkelen bent.

Zodra je dit hebt gedaan, lees je de code door in de volgorde die django zou volgen totdat je de regel code bereikt die een url probeert te maken voor je my_url_name. Nogmaals, dit is waarschijnlijk op een plaats die je onlangs hebt gewijzigd.

Nu je hebt ontdekt waar de fout zich voordoet, kun je de andere delen van de foutmelding gebruiken om het probleem op te lossen.

De url-naam

  • Zijn er typefouten?
  • Heb je de url opgegeven waarmee je toegang probeert te krijgen tot de opgegeven naam?
  • Als je app_name hebt ingesteld in urls.pyvan de app (bijv. app_name = 'my_app') of als je de app hebt opgenomen met een naamruimte (bijv. include('myapp.urls', namespace='myapp'), dan moet u de naamruimte opnemen bij het omkeren, bijv. {% url 'myapp:my_url_name' %}of reverse('myapp:my_url_name').

Argumenten en zoekwoordargumenten

De argumenten en trefwoordargumenten worden gebruikt om te matchen met alle capture-groepen die aanwezig zijn binnen de opgegeven URL, die kunnen worden geïdentificeerd door de omringende ()-haakjes in het URL-patroon.

Ervan uitgaande dat de url die u zoekt aanvullende argumenten vereist, kijk dan in de foutmelding en kijk eerst of de waarde voor de gegeven argumenten correct lijkt te zijn.

Als ze niet correct zijn:

  • De waarde ontbreekt of een lege tekenreeks

    Dit betekent over het algemeen dat de waarde die u doorgeeft, niet de waarde bevat die u verwacht. Kijk waar je de waarde voor toewijst, stel breekpunten in en je moet uitzoeken waarom deze waarde niet correct wordt doorgegeven.

  • Het zoekwoordargument bevat een typefout

    Corrigeer dit in het url-patroon of in de url die u aan het maken bent.

Als ze correct zijn:

  • Debuggen van de regex

    U kunt een website zoals regexrgebruiken om snel te testen of uw patroon overeenkomt met de url die u denkt te maken , Kopieer het url-patroon naar het regex-veld bovenaan en gebruik vervolgens het tekstgebied om alle URL’s op te nemen waarvan u denkt dat het moet overeenkomen.

    Veelgemaakte fouten:

    • Overeenkomst met het .jokerteken of andere regex-tekens

      Vergeet niet om de specifieke tekens te escapen met een \voorvoegsel

    • Alleen overeenkomsten met kleine/hoofdletters

      Probeer A-Zof \wte gebruiken in plaats van A-Zof A-Z

  • Controleer of het patroon dat u zoekt, is opgenomen in de geprobeerde patronen

    Als het hier niet staat, is het mogelijk dat u bent vergeten uw app op te nemen in de INSTALLED_APPS-instelling (of het bestellen van de apps in INSTALLED_APPSmoet mogelijk worden bij)

Django-versie

In Django 1.10 is de mogelijkheid om een ​​url om te draaien via het python-pad verwijderd. In plaats daarvan moet het genoemde pad worden gebruikt.


Als je het probleem nog steeds niet kunt vinden, stel dan gerust een nieuwe vraag met daarin wat je hebt geprobeerd, wat je hebt onderzocht (je kunt naar deze vraag linken) en voeg vervolgens de relevante code voor het probleem – de url waarmee u overeenkomt, eventuele relevante url-patronen, het deel van het foutbericht dat laat zien wat django probeerde te matchen, en mogelijk de instelling INSTALLED_APPSindien van toepassing.


Antwoord 2

En zorg ervoor dat uw route in de lijst met routes staat:

./manage.py show_urls | grep path_or_name

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


Antwoord 3

Het kan zijn dat het niet de sjabloon laadt die u verwacht. Ik heb een nieuwe klasse toegevoegd die is geërfd van UpdateView– ik dacht dat het automatisch de sjabloon zou kiezen uit wat ik mijn klas noemde, maar het laadde het eigenlijk op basis van de eigenschap modelop de klasse, waardoor een ander (verkeerd) sjabloon werd geladen. Nadat ik template_nameexpliciet had ingesteld voor de nieuwe klasse, werkte het prima.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

four × 5 =

Other episodes