Qu'est-ce qu'une erreur NoReverseMatch et comment la corriger?

119

J'ai du code et quand il s'exécute, il lance un NoReverseMatch, en disant:

NoReverseMatch à / my_url / Reverse pour «my_url_name» avec les arguments «()» et les arguments de mot-clé «{}» introuvables. n motif (s) essayé (s): []

Qu'est-ce que cela signifie et que puis-je faire?

Sayse
la source

Réponses:

243

L' NoReverseMatcherreur indique que Django ne trouve pas de modèle d'URL correspondant à l'URL que vous avez fournie dans l'une des URL de votre application installée.

L'exception NoReverseMatch est déclenchée par django.core.urlresolvers lorsqu'une URL correspondante dans votre URLconf ne peut pas être identifiée en fonction des paramètres fournis.

Pour commencer à le déboguer, vous devez commencer par décomposer le message d'erreur qui vous est donné.

  • NoReverseMatch à / my_url /

    Il s'agit de l'URL en cours de rendu, c'est cette URL à laquelle votre application tente actuellement d'accéder mais elle contient une URL qui ne peut pas être mise en correspondance

  • Inverser pour "my_url_name"

    C'est le nom de l'url qu'il ne trouve pas

  • avec des arguments '()' et

    Ce sont les arguments non-mot-clé qu'il fournit à l'url

  • arguments de mot clé '{}' introuvables.

    Ce sont les arguments de mots clés qu'il fournit à l'url

  • n motif (s) essayé (s): []

    Voici les modèles qu'il a pu trouver dans vos fichiers urls.py avec lesquels il a tenté de faire correspondre

Commencez par localiser le code dans votre source correspondant à l'URL en cours de rendu - l'url, la vue et tous les modèles impliqués. Dans la plupart des cas, ce sera la partie du code que vous développez actuellement.

Une fois que vous avez fait cela, lisez le code dans l'ordre que django suivrait jusqu'à ce que vous atteigniez la ligne de code qui tente de construire une URL pour votre my_url_name. Encore une fois, c'est probablement dans un endroit que vous avez récemment changé.

Maintenant que vous avez découvert où l'erreur se produit, utilisez les autres parties du message d'erreur pour résoudre le problème.

Le nom de l'URL

  • Y a-t-il des fautes de frappe?
  • Avez-vous indiqué l'URL à laquelle vous essayez d'accéder au prénom?
  • Si vous avez défini app_name dans l'application urls.py(par exemple app_name = 'my_app') ou si vous avez inclus l'application avec un espace de noms (par exemple include('myapp.urls', namespace='myapp'), vous devez inclure l'espace de noms lors de l'inversion, par exemple {% url 'myapp:my_url_name' %}ou reverse('myapp:my_url_name').

Arguments et arguments de mots-clés

Les arguments et les arguments de mot-clé sont utilisés pour correspondre à tous les groupes de capture présents dans l'URL donnée qui peuvent être identifiés par les ()crochets entourant le modèle d'URL.

En supposant que l'URL que vous correspondez nécessite des arguments supplémentaires, regardez dans le message d'erreur et regardez d'abord si la valeur des arguments donnés semble correcte.

S'ils ne sont pas corrects:

  • La valeur est manquante ou une chaîne vide

    Cela signifie généralement que la valeur que vous transmettez ne contient pas la valeur que vous attendez. Regardez où vous lui attribuez la valeur, définissez des points d'arrêt et vous devrez comprendre pourquoi cette valeur n'est pas transmise correctement.

  • L'argument mot-clé a une faute de frappe

    Corrigez cela soit dans le modèle d'url, soit dans l'url que vous construisez.

S'ils sont corrects:

  • Déboguer le regex

    Vous pouvez utiliser un site Web tel que regexr pour tester rapidement si votre modèle correspond à l'url que vous pensez créer, copiez le modèle d'URL dans le champ regex en haut, puis utilisez la zone de texte pour inclure toutes les URL que vous pensez devrait correspondre contre.

    Erreurs fréquentes:

    • Correspondance avec le .caractère joker ou tout autre caractère regex

      N'oubliez pas d'échapper aux caractères spécifiques avec un \préfixe

    • Correspondance uniquement avec les caractères minuscules / majuscules

      Essayez d'utiliser soit a-Zou à la \wplace de a-zouA-Z

  • Vérifiez que le modèle que vous correspondez est inclus dans les modèles essayés

    Si ce n'est pas ici, il est possible que vous ayez oublié d'inclure votre application dans le INSTALLED_APPSparamètre (ou l'ordre des applications dans INSTALLED_APPSpeut nécessiter un examen)

Version de Django

Dans Django 1.10, la possibilité d'inverser une URL par son chemin python a été supprimée. Le chemin nommé doit être utilisé à la place.


Si vous ne parvenez toujours pas à localiser le problème, n'hésitez pas à poser une nouvelle question qui comprend ce que vous avez essayé, ce que vous avez recherché (vous pouvez créer un lien vers cette question), puis inclure le code correspondant au issue - l'url que vous correspondez, tous les modèles d'URL pertinents, la partie du message d'erreur qui montre ce que django a essayé de faire correspondre, et éventuellement le INSTALLED_APPSparamètre le cas échéant.

Sayse
la source
11
Enfin, nous avons une réponse canonique que nous pouvons fournir comme cible
dup
pouvez-vous s'il vous plaît élaborer sur le chemin nommé dans django 1.10?
sage poudel
2
Oui, set app_name in the app's urls.py (e.g. app_name = 'my_app') c'est le point
CK
Je trouve ce testeur de regex en direct plus utile: regex101.com
obotezat
Merci pour ce superbe tutoriel sur NoReverseMatch! J'ai pu régler mon problème.
newmachines_xyz
1

Et assurez-vous que votre itinéraire dans la liste des itinéraires:

./manage.py show_urls | grep path_or_name

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

Daniil Mashkin
la source
2
﹣1 show_urlsn'est pas une fonctionnalité Django, cela ne répondra pas à la question.
Urda