Исключение ViewDoesNotExist

Исключение ViewDoesNotExist возникает в процессе маршрутизации URL-адресов, когда Django не может найти или импортировать представление, указанное в конфигурации URL-адресов. Эта ошибка может быть вызвана опечаткой в имени представления, неправильным путем импорта, отсутствием файла с представлением или неверной структурой модуля. Обычно исключение перехватывается системой маршрутизации и приводит к ошибке 404, если представление не найдено ни в одном из проверенных URL-шаблонов.

Синтаксис

pythondjango.core.exceptions.ViewDoesNotExist

Исключение наследуется от базового класса Exception и автоматически импортируется в модуле django.core.exceptions. Обычно его не нужно импортировать вручную, так как оно обрабатывается внутри механизма URL-разрешения.

Пример

Рассмотрим простой пример, в котором возникает исключение из-за опечатки в имени представления:

python# urls.py
from django.urls import path
from myapp import views

urlpatterns = [
  path('articles/', views.article_list, name='article_list'),
  path('articles/<int:id>/', views.article_detil, name='article_detail'),  # опечатка в названии
]

При попытке перейти по URL '/articles/1/' будет возбуждено исключение ViewDoesNotExist:

python"django.core.exceptions.ViewDoesNotExist: Could not import myapp.views.article_detil. View does not exist in module myapp.views."

Пример

Исключение также может возникнуть при использовании строкового пути к представлению, если модуль не существует или содержит синтаксические ошибки:

python# urls.py
from django.urls import path

urlpatterns = [
  path('users/', 'myapp.views.user_list', name='user_list'),  # старый синтаксис
  path('users/<int:id>/', 'myapp.views.user_detil', name='user_detail'),
]

В этом случае ошибка укажет на невозможность импорта модуля или представления:

python"django.core.exceptions.ViewDoesNotExist: Could not import myapp.views.user_list. Parent module myapp.views does not exist."

Пример

Исключение может быть вызвано при попытке использования функции resolve для разрешения URL-адреса вручную:

pythonfrom django.urls import resolve

try:
  resolved = resolve('/non-existent/')
except Exception as e:
  print(f"Error: {e}")

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

python"Error: Could not resolve view for path '/non-existent/'"

Пример

Для отлова конкретного исключения при ручном разрешении URL-адресов используйте импорт:

pythonfrom django.core.exceptions import ViewDoesNotExist
from django.urls import resolve

try:
  resolved = resolve('/articles/999/')
except ViewDoesNotExist as e:
  print(f"View not found: {e}")
except Exception as e:
  print(f"Other error: {e}")

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

python"View not found: Could not import myapp.views.article_detail. View does not exist in module myapp.views."

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

  • исключение Resolver404,
    которое возникает при невозможности разрешить URL-адрес
  • исключение Http404,
    которое используется для возврата ошибки 404
  • исключение NoReverseMatch,
    которое возникает при ошибке обратного разрешения URL-адресов
  • исключение DoesNotExist,
    которое возникает при отсутствии объекта в базе данных