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

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

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

Sayse

Ответов: 4

Ответы (4)

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

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

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

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

    • Соответствие только строчным / прописным символам

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

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

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

Версия Django

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


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

Возможно, он не загружает ожидаемый шаблон. Я добавил новый класс, унаследованный от UpdateView - я думал, что он автоматически выберет шаблон из того, что я назвал своему классу, но на самом деле он загрузил его на основе свойства model в классе , что привело к загрузке другого (неправильного) шаблона. Как только я явно установил имя_шаблона для нового класса, он работал нормально.

Часть аргументов обычно является объектом из ваших моделей. Не забудьте добавить его в контекст представления. В противном случае ссылка на объект в шаблоне будет пустой и, следовательно, не будет соответствовать URL-адресу с object_id.

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

./manage.py show_urls | grep path_or_name

https://github.com/django-extensions/django-extensions

2022 WebDevInsider