web-dev-qa-db-fra.com

Qu'est-ce qu'une erreur NoReverseMatch et comment puis-je la réparer?

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

NoReverseMatch at/my_url/Reverse pour 'my_url_name' avec les arguments '()' et les arguments de mots clés '{}' introuvables. n motif (s) essayé (s): []

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

75
Sayse

L'erreur NoReverseMatch indique que Django ne peut pas trouver de modèle d'URL correspondant à l'URL que vous avez fournie dans les 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 supprimer le message d'erreur qui vous est donné.

  • NoReverseMatch at/my_url /

    Il s'agit de l'URL en cours de rendu. Il s'agit de l'URL à laquelle votre application tente actuellement d'accéder, mais elle contient une URL qui ne peut pas correspondre.

  • Inverse pour 'my_url_name'

    Ceci est le nom de l'URL qu'il ne peut pas trouver

  • avec des arguments '()' et 

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

  • arguments de mot clé '{}' non trouvé. 

    Ce sont les arguments de mot clé qu'il fournit à l'URL

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

    Ce sont les modèles qu’il a pu trouver dans vos fichiers urls.py qu’il a essayé 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 êtes en train de développer. 

Une fois que cela est fait, lisez le code dans l'ordre que Django suivrait jusqu'à atteindre 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 fourni l'URL que vous essayez d'accéder au prénom?
  • Si vous avez défini app_name dans le urls.py de l'application (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 alors inclure l'espace de noms lors de l'annulation, 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 faire correspondre les groupes de capture présents dans l'URL donnée et pouvant être identifiés par les crochets () entourant le modèle d'URL.

En supposant que l'URL requise corresponde à des arguments supplémentaires, jetez un coup d'œil dans le message d'erreur et commencez par regarder si la valeur des arguments donnés semble être 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. Jetez un coup d'œil à l'endroit où vous lui affectez la valeur, définissez des points d'arrêt et vous devrez comprendre pourquoi cette valeur n'est pas transmise correctement.

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

    Corrigez cela dans le modèle d'URL ou dans l'URL que vous construisez.

S'ils sont corrects:

  • Déboguer le regex

    Vous pouvez utiliser un site Web tel que regexr pour vérifier rapidement si votre modèle correspond à l'URL que vous pensez créer. Copiez le modèle d'URL dans le champ d'expression régulière situé en haut, puis utilisez la zone de texte pour inclure les URL. que vous pensez qu'il devrait correspondre.

    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 a-Z ou \w au lieu de a-z ou A-Z

  • Vérifiez que le motif que vous faites correspondre est inclus dans les motifs essayés

    Si ce n'est pas le cas, il est possible que vous ayez oublié d'inclure votre application dans le paramètre INSTALLED_APPS (ou vous devrez peut-être examiner l'ordre des applications dans INSTALLED_APPS).

Version Django

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


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

163
Sayse

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

./manage.py show_urls | grep path_or_name
1
Daniil Mashkin