РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
488 of 818 menu

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,
    которое возникает при отсутствии записи в БД
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить