Как я могу устранить эту ошибку Django TemplateDoesNotExist?
Я работаю над учебником "Django 5 на примере" и почти закончил с главой 12, однако в самом конце, когда текст просит вас запустить сервер и оформить заказ http://127.0.0.1:8000/accounts/login , я получаю следующую ошибку:
Шаблоны не существуют в /accounts/login/ registration/login.html Метод запроса: ПОЛУЧИТЬ URL запроса: http://127.0.0.1:8000/accounts/login/ Версия Django: 5.2.5 Тип исключения: TemplateDoesNotExist Exception Значение: registration/login.html Исключение Местоположение: C:\Users\Zergy\python\django\django-learning\env\educa\Lib\site-packages\django\template\loader.py, строка 47, в select_template, созданном во время просмотра: django.contrib.auth.views.LoginView на Python Исполняемый файл: C:\Users\Zergy\python\django\django-learning\env\educa\Scripts\python.exe Версия Python: 3.13.1 Путь к Python: ['C:\Users\Zergy\python\django\django-learning\educa ', 'C:\Users\Zergy\AppData\Local\Programs\Python\Python313\python313.zip ', 'C:\Users\Zergy\AppData\Local\Programs\Python\Python313\DLLs ', 'C:\Users\Zergy\AppData\Local\Programs\Python\Python313\Lib ', 'C:\Users\Zergy\AppData\Local\Programs\Python\Python313 ', 'C:\Users\Zergy\python\django\django-learning\env\educa ', 'C:\Users\Zergy\python\django\django-learning\env\educa\Lib\site-packages ']
Загрузчик шаблонов postmortem Django попытался загрузить эти шаблоны в следующем порядке:
Используем движок django:
django.template.loaders.app_directories.Погрузчик: C:\Users\Zergy\python\django\django-learning\env\educa\Lib\site-packages\django\contrib\admin\templates\registration\login.html (Источник не существует) django.template.loaders.app_directories.каталоги приложений.Погрузчик: C:\Users\Zergy\python\django\django-learning\env\educa\Lib\site-packages\django\contrib\auth\templates\registration\login.html (Источник не существует)
Я проверил, перепроверил и утроил, что моя орфография и структура файла совпадают с тем, что указано в учебнике, но ошибка сохраняется.
Вот соответствующие части settings.py:
INSTALLED_APPS = [
'courses.apps.CoursesConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
ROOT_URLCONF = 'educa.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Вот структура файла
Вот educa/urls.py
from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('accounts/login/', auth_views.LoginView.as_view(), name='login'),
path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'),
path('admin/', admin.site.urls),
]
if settings.DEBUG:
urlpatterns += static(
settings.MEDIA_URL, document_root=settings.MEDIA_ROOT
)
Вот courses/templates/base.html
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>{% block title %}Educa{% endblock title %}</title>
<link rel="stylesheet" href="{% static "css/base.css" %}">
</head>
<body>
<div id="header">
<a href="/" class="logo">Educa</a>
<ul class="menu">
{% if request.user.is_authenticated %}
<li>
<form action="{% url "logout" %}" method="post">
<button type="submit">Sign out</button>
</form>
</li>
{% else %}
<li><a href="{% url "login" %}">Sign in</a></li>
{% endif %}
</ul>
</div>
<div id="content">
{% block content %}
{% endblock content %}
</div>
<script>
document.addEventListener('DOMContentLoaded', (event) => {
// DOM DOMContentLoaded
{% block domready %}
{% endblock %}
})
</script>
</body>
</html>
вот courses/templates/registration/login.html
{% extends "base.html" %}
{% block title %}Log-in{% endblock title %}
{% block content %}
<h1>Log-in</h1>
<div class="module">
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% else %}
<p>Please, use the following form to log-in:</p>
{% endif %}
<div class="login-form">
<form action="{% url 'login' %}" method="post">
{{ form.as_p }}
{% csrf_token %}
<input type="hidden" name="next" value="{{ next }}" />
<p><input type="submit" value="Log-in"></p>
</form>
</div>
</div>
{% endblock content %}
наконец, вот courses/admin.py (если нужно)
from django.contrib import admin
from .models import Subject, Course, Module
@admin.register(Subject)
class SubjectAdmin(admin.ModelAdmin):
list_display = ['title', 'slug']
prepopulated_fields = {'slug': ('title',)}
class ModuleInline(admin.StackedInline):
model = Module
@admin.register(Course)
class CourseAdmin(admin.ModelAdmin):
list_display = ['title', 'subject', 'created']
list_filter = ['created', 'subject']
search_fields = ['title', 'overview']
prepopulated_fields = {'slug': ('title',)}
inlines = [ModuleInline]
Я проверил несколько старых сообщений stackoverflow об этой ошибке, но ни одно из решений, которые я видел (например, добавление / в конце url-адреса), не имело отношения к моей ситуации. Я сделал все, что мог, кроме буквального копирования всего репозитория сюда , чтобы мой проект выглядел как учебник, но я все равно получаю эту ошибку. Моя интуиция подсказывает мне, что структура папок как-то неправильна, но если так, то почему в учебнике это показано именно так? Она устарела?
TEMPLATES = [{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True, # <-- must be True
"OPTIONS": {"context_processors": [
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
]},
}]
courses/templates/registration/login.html
path("accounts/login/",
auth_views.LoginView.as_view(template_name="registration/login.html"),
name="login")
import os
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]