Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

  • NoReverseMatch at/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 в app 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-адреса, которые вы считаете должен соответствовать.

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

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

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

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

      Попробуйте использовать aZ или \w вместо az или AZ

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

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

Версия Django

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


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

Ответ 3

Вы видите эту ошибку, потому что используете версию 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