Что такое ошибка NoReverseMatch и как ее исправить?

119

У меня есть код, и когда он выполняется, он выдает NoReverseMatch, говоря:

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

Что это означает и что я могу с этим поделать?

Sayse
источник

Ответы:

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-адрес, по которому пытаетесь получить доступ к заданному имени?
  • Если вы установили app_name в приложении 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

В Django 1.10 была удалена возможность инвертировать URL-адрес по его пути в Python. Вместо этого следует использовать именованный путь.


Если вы все еще не можете отследить проблему, не стесняйтесь задавать новый вопрос, который включает в себя то, что вы пробовали, что вы исследовали (вы можете указать ссылку на этот вопрос), а затем включите соответствующий код в проблема - URL-адрес, который вы сопоставляете, любые соответствующие шаблоны URL-адресов, часть сообщения об ошибке, которая показывает, что django пытался сопоставить, и, возможно, INSTALLED_APPSпараметр, если это применимо.

Sayse
источник
11
Наконец, у нас есть канонический ответ, который мы можем предоставить в качестве цели для
дублирования
не могли бы вы уточнить именованный путь в django 1.10?
sage poudel
2
Да, в set app_name in the app's urls.py (e.g. app_name = 'my_app') том-то и дело
СК
Я считаю, что этот живой тестер регулярных выражений более полезен: regex101.com
obotezat 07
Спасибо за этот превосходный урок по NoReverseMatch! Я смог разобраться в своей проблеме.
newmachines_xyz