NoReverseMatch
Исключение NoReverseMatch выбрасывается в Django,
когда система не может сопоставить переданные параметры
с определённым маршрутом в файле urls.py.
Обычно это происходит при использовании тега {% url %}
в шаблонах или функции reverse в представлениях.
Основные причины: неверное имя маршрута, несовпадение
количества или типов аргументов, отсутствие обязательных
параметров.
Синтаксис исключения
from django.urls import reverse
# Базовый синтаксис вызова
reverse('имя_маршрута', args=[], kwargs={})
Пример . Модель и маршрут
Рассмотрим модель статьи и соответствующие маршруты для демонстрации исключения:
from 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-паттернов:
from 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 по несуществующему имени маршрута приводит к исключению:
from django.urls import reverse
try:
url = reverse('article_detail_new')
except Exception as e:
print(f"Exception: {e}")
Результат выполнения кода:
"Exception: Reverse for 'article_detail_new' not found. 'article_detail_new' is not a valid view function or pattern name."
Пример . №2 - недостаточное количество аргументов
Маршрут article_detail требует один
обязательный аргумент slug. Если не передать
его, возникает исключение:
from django.urls import reverse
try:
url = reverse('article_detail')
except Exception as e:
print(f"Exception: {e}")
Результат выполнения кода:
"Exception: Reverse for 'article_detail' with no arguments not found. 1 pattern(s) tried: ['articles/(?P<slug>[-a-zA-Z0-9_]+)/\\Z']"
Пример . №3 - неправильный тип аргумента
Передача аргумента неправильного типа для маршрута,
ожидающего slug:
from django.urls import reverse
try:
url = reverse('article_detail', args=['article with spaces'])
except Exception as e:
print(f"Exception: {e}")
Результат выполнения кода:
"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 - именованные параметры в шаблоне
Пример использования в шаблоне, который также может вызвать исключение:
<!-- Неправильно: забыли передать slug -->
<a href="{% url 'article_detail' %}">Ссылка</a>
<!-- Правильно: передаём необходимые параметры -->
<a href="{% url 'article_detail' slug=article.slug %}">Ссылка</a>
Смотрите также
-
исключение
Resolver404,
которое возникает при несовпадении URL-паттернов -
исключение
ViewDoesNotExist,
которое выбрасывается при отсутствии представления -
исключение
Http404,
которое возвращается при ненайденном объекте -
исключение
DoesNotExist,
которое возникает при отсутствии записи в БД