NoReverseMatch

Исключение NoReverseMatch выбрасывается в Django, когда система не может сопоставить переданные параметры с определённым маршрутом в файле urls.py. Обычно это происходит при использовании тега {% url %} в шаблонах или функции reverse в представлениях. Основные причины: неверное имя маршрута, несовпадение количества или типов аргументов, отсутствие обязательных параметров.

Синтаксис исключения

pythonfrom django.urls import reverse

# Базовый синтаксис вызова
reverse('имя_маршрута', args=[], kwargs={})

Пример . Модель и маршрут

Рассмотрим модель статьи и соответствующие маршруты для демонстрации исключения:

pythonfrom django.db import models
from django.urls import reverse

class Article(models.Model):
  title = models.CharField(max_length=100)
  slug = models.SlugField(unique=True)
  category = models.CharField(max_length=50)

  def get_absolute_url(self):
    return reverse('article_detail', args=[self.slug])

Файл маршрутов с двумя видами URL-паттернов:

pythonfrom django.urls import path
from .views import article_detail, article_list

urlpatterns = [
  path('articles/', article_list, name='article_list'),
  path('articles/<slug:slug>/', article_detail, name='article_detail'),
  path('articles/<int:year>/<slug:slug>/', article_detail, name='article_detail_year'),
]

Пример . №1 - неверное имя маршрута

Попытка построить URL по несуществующему имени маршрута приводит к исключению:

pythonfrom django.urls import reverse

try:
  url = reverse('article_detail_new')
except Exception as e:
  print(f"Exception: {e}")

Результат выполнения кода:

python"Exception: Reverse for 'article_detail_new' not found. 'article_detail_new' is not a valid view function or pattern name."

Пример . №2 - недостаточное количество аргументов

Маршрут article_detail требует один обязательный аргумент slug. Если не передать его, возникает исключение:

pythonfrom django.urls import reverse

try:
  url = reverse('article_detail')
except Exception as e:
  print(f"Exception: {e}")

Результат выполнения кода:

python"Exception: Reverse for 'article_detail' with no arguments not found. 1 pattern(s) tried: ['articles/(?P<slug>[-a-zA-Z0-9_]+)/\\Z']"

Пример . №3 - неправильный тип аргумента

Передача аргумента неправильного типа для маршрута, ожидающего slug:

pythonfrom django.urls import reverse

try:
  url = reverse('article_detail', args=['article with spaces'])
except Exception as e:
  print(f"Exception: {e}")

Результат выполнения кода:

python"Exception: Reverse for 'article_detail' with arguments '('article with spaces',)' not found. 1 pattern(s) tried: ['articles/(?P<slug>[-a-zA-Z0-9_]+)/\\Z']"

Пример . №4 - именованные параметры в шаблоне

Пример использования в шаблоне, который также может вызвать исключение:

html<!-- Неправильно: забыли передать slug -->
<a href="{% url 'article_detail' %}">Ссылка</a>

<!-- Правильно: передаём необходимые параметры -->
<a href="{% url 'article_detail' slug=article.slug %}">Ссылка</a>

Смотрите также

  • исключение Resolver404,
    которое возникает при несовпадении URL-паттернов
  • исключение ViewDoesNotExist,
    которое выбрасывается при отсутствии представления
  • исключение Http404,
    которое возвращается при ненайденном объекте
  • исключение DoesNotExist,
    которое возникает при отсутствии записи в БД