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


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

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

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

2 61

2 ответа:

The NoReverseMatch ошибка говорит, что Django не может найти соответствующий шаблон url для url, который вы предоставили в любом из URL-адресов вашего установленного приложения.

исключение NoReverseMatch вызывается django.ядро.urlresolvers, когда соответствующий URL-адрес в URL-конфигурации не могут быть определены на основании параметров, указанных.

чтобы начать отладку, вам нужно начать с удаления сообщения об ошибке, приведенного в вы.

  • NoReverseMatch at /my_url/

    это url-адрес, который в настоящее время отображается, именно этот url-адрес, который ваше приложение в настоящее время пытается получить доступ, но он содержит url-адрес, который не может быть сопоставлен

  • обратный для my_url_name'

    это имя url-адреса, который он не может найти

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

    это не ключевое слово аргументы его предоставления в url

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

    это ключевые аргументы, которые он предоставляет url

  • Н шаблон(ы) попробовал: []

    это шаблоны, которые он смог найти в вашем 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

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


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

вы видите эту ошибку, потому что вы используете версию django меньше, чем django 1.11. Попробуйте обновить версию Django и ошибка будет исправлена.

использование:

pip install --upgrade django==1.11

ссылки: https://docs.djangoproject.com/en/2.0/releases/1.11/#whats-new-1-11