Що таке помилка NoReverseMatch і як її виправити?


119

У мене є якийсь код, і коли він виконується, він видає NoReverseMatch, кажучи:

NoReverseMatch в / my_url / Зворотній для 'my_url_name' з аргументами '()' та аргументами ключових слів '{}' не знайдено. n випробуваних моделей: []

Що це означає, і що я можу з цим зробити?

Відповіді:


243

NoReverseMatchПомилка говорить , що Джанго не може знайти шаблон відповідності URL - адреса для URL наданих Вами в будь-якому з ваших адрес вставленого додатки.

Виняток NoReverseMatch піднімається django.core.urlresolvers, коли відповідна URL-адреса у вашій URLconf не може бути ідентифікована на основі наданих параметрів.

Щоб почати налагоджувати його, для початку потрібно виконати повідомлення про помилку, надане вам.

  • NoReverseMatch на / my_url /

    Це URL-адреса, яка наразі надається, саме ця URL-адреса зараз намагається отримати доступ, але вона містить URL-адресу, яку неможливо зіставити

  • Зворотний бік для "my_url_name"

    Це ім'я URL-адреси, яке він не може знайти

  • з аргументами '()' та

    Це аргументи, що не належать до ключових слів, його надання URL-адресу

  • аргументи ключового слова '{}' не знайдено.

    Це аргументи ключових слів, що їх надає URL

  • n випробуваних моделей: []

    Це зразки, які вдалося знайти у файлах urls.py, з якими він намагався відповідати

Почніть з локації коду у своєму джерелі, що стосується URL-адреси, що наразі надається - URL-адреси, перегляду та будь-яких задіяних шаблонів. У більшості випадків це частина коду, який ви зараз розробляєте.

Щойно ви зробите це, прочитайте код у тому порядку, який би виконував django, поки ви не досягнете рядка коду, який намагається побудувати URL для вашого my_url_name. Знову ж таки, це, мабуть, у місці, яке ви нещодавно змінили.

Тепер, коли ви виявили, де виникає помилка, використовуйте інші частини повідомлення про помилку для розробки проблеми.

Назва URL-адреси

  • Чи є друкарські помилки?
  • Ви надали URL-адресу, з якою ви намагаєтесь отримати доступ до вказаного імені?
  • Якщо ви вказали ім'я_прикладу у програмі urls.py(наприклад app_name = 'my_app') або якщо ви додали додаток із простором імен (наприклад include('myapp.urls', namespace='myapp'), вам потрібно включити простір імен під час повернення назад, наприклад, {% url 'myapp:my_url_name' %}або reverse('myapp:my_url_name').

Аргументи та аргументи ключових слів

Аргументи та аргументи ключових слів використовуються для співставлення з будь-якими групами захоплення, які присутні в даній URL-адресі, які можуть бути ідентифіковані довколишніми ()дужками у шаблоні URL-адреси.

Якщо припустити, що URL-адреса, яка відповідає вам, вимагає додаткових аргументів, перегляньте повідомлення про помилку і спочатку подивіться, чи виглядає значення вказаних аргументів правильним.

Якщо вони неправильні:

  • Значення відсутнє або порожній рядок

    Це загалом означає, що значення, яке ви передаєте, не містить значення, яке ви очікуєте. Погляньте, де ви призначите для нього значення, встановіть точки прориву, і вам потрібно буде з'ясувати, чому це значення не проходить правильно.

  • Аргумент ключового слова має помилку

    Виправте це або в шаблоні URL-адреси, або в створеному вами URL-адресі.

Якщо вони правильні:

  • Налагоджуйте регулярний вираз

    Ви можете використовувати веб-сайт, такий як regexr, щоб швидко перевірити, чи відповідає ваш шаблон URL- адресі, яку ви створюєте, скопіюйте шаблон URL-адреси в поле регулярного виразів у верхній частині, а потім скористайтеся текстовою областю для включення будь-яких URL-адрес, які ви вважаєте повинні відповідати проти.

    Поширені помилки:

    • Збігання з .символом підстановки або будь-якими іншими символами регулярного виразів

      Не забудьте уникнути конкретних символів з \префіксом

    • Тільки відповідність символів нижнього / верхнього регістру

      Спробуйте використовувати або a-Zабо \wзамість a-zабоA-Z

  • Переконайтеся, що відповідна модель включена до випробуваних моделей

    Якщо тут немає, можливо, ви забули включити свій додаток у INSTALLED_APPSналаштування (або замовлення програм у межах, INSTALLED_APPSможливо, знадобиться переглянути)

Версія Джанго

У Django 1.10 можливість зворотного звернення за URL-адресою пітона була видалена. Натомість слід використовувати названий шлях.


Якщо ви все ще не можете віднайти проблему, не соромтеся задати нове запитання, що включає те, що ви спробували, що ви дослідили (Ви можете зв’язати це питання), а потім додайте відповідний код до issue - URL-адреса, яку ви узгоджуєте, будь-які відповідні шаблони URL-адреси, частина повідомлення про помилку, яка показує, що django намагалася зіставити, і, можливо, INSTALLED_APPSвстановлення, якщо це застосовно.


11
Нарешті, у нас є канонічна відповідь, яку ми можемо надати як ціль
дублювання

Чи можете ви, будь ласка, детальніше розглянути іменований шлях у django 1.10?
шавлія пюре

2
Так, set app_name in the app's urls.py (e.g. app_name = 'my_app') сенс
CK

Мені здається, що цей тестер живого
регексу є

Дякую за цей чудовий підручник на NoReverseMatch! Мені вдалося розібратися зі своїм питанням.
newmachines_xyz

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.