it-swarm.com.ru

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

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

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

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

75
Sayse

Ошибка NoReverseMatch говорит о том, что Django не может найти соответствующий шаблон URL для 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 в поле regex вверху, а затем используйте текстовую область, чтобы включить любые URL. что вы думаете, это должно соответствовать.

    Распространенные ошибки:

    • Сопоставление с символом подстановки . или любыми другими символами регулярного выражения

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

    • Соответствует только символам нижнего/верхнего регистра

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

  • Убедитесь, что соответствующий шаблон включен в список

    Если его здесь нет, то, возможно, вы забыли включить свое приложение в настройку INSTALLED_APPS (или, возможно, потребуется рассмотреть порядок приложений внутри INSTALLED_APPS)

Джанго версия

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


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

163
Sayse

И убедитесь, что ваш маршрут в списке маршрутов:

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