TemplateDoesNotExist в /accounts/login/
Я проверил ответы здесь, здесь, здесь и здесь, и хотя я получаю ту же ошибку, очевидно, у меня другая первопричина, поскольку эти ответы не работают у меня.
Вот в чем проблема: я использую Django's LoginView, переопределяя имя шаблона, но это работает только иногда. Если я попадаю на экран входа из навигационной панели, он работает отлично, но тот же самый url, когда я попадаю на него другим методом, выдает template does not exist ошибку. Мой файл URLs:
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = "accounts"
urlpatterns = [
path(
"login",
auth_views.LoginView.as_view(template_name="accounts/login.html"),
name="login",
),
path("logout", auth_views.LogoutView.as_view(), name="logout"),
path("signup", views.SignUp.as_view(), name="signup"),
]
У меня есть элемент навигации для экрана входа в систему, и он отлично работает. Соответствующий раздел в шаблоне:
{% else %}
<li class="nav-item"><a href="{% url 'groups:all' %}" class="nav-link">Groups</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'accounts:login' %}">Login</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'accounts:signup' %}">Sign Up</a></li>
{% endif %}
Если кто-то нажимает на ссылку login в навигационной панели, она переводит вас на http://127.0.0.1:8000/accounts/login и работает отлично.
НО: у меня есть еще одна секция кода, в которой необходимо войти в систему, чтобы ссылка работала, а если вы не вошли, она перенаправляет вас на экран входа. URL входа выглядит хорошо: http://127.0.0.1:8000/accounts/login/?next=/groups/join/test-group-1, но на этот раз вместо экрана входа в систему появляется вот такая ошибка:
TemplateDoesNotExist at /accounts/login/
registration/login.html
Request Method: GET
Request URL: http://127.0.0.1:8000/accounts/login/?next=/groups/join/test-group-1
Django Version: 4.1.4
Exception Type: TemplateDoesNotExist
Exception Value:
registration/login.html
Exception Location: /opt/homebrew/anaconda3/envs/py311django/lib/python3.11/site-packages/django/template/loader.py, line 47, in select_template
Raised during: django.contrib.auth.views.LoginView
Python Executable: /opt/homebrew/anaconda3/envs/py311django/bin/python
Python Version: 3.11.0
Python Path:
['/Users/brendenmillstein/Dropbox '
'(Personal)/BSM_Personal/Coding/Udemy/full_stack_django_tutorial/BSM_materials/python/social_network/simplesocial',
'/opt/homebrew/anaconda3/envs/py311django/lib/python311.zip',
'/opt/homebrew/anaconda3/envs/py311django/lib/python3.11',
'/opt/homebrew/anaconda3/envs/py311django/lib/python3.11/lib-dynload',
'/opt/homebrew/anaconda3/envs/py311django/lib/python3.11/site-packages']
Server time: Sun, 05 Feb 2023 06:01:34 +0000
Я уже добавил все приложения в список INSTALLED_APPS в settings,py, а также добавил
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_DIR = Path.joinpath(BASE_DIR, "templates")
а также добавил TEMPLATE_DIR в список TEMPLATES:
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [TEMPLATE_DIR],
Тот факт, что логин работает, когда я попадаю на него из навигационной панели, но не работает в другое время, сбивает меня с толку.
Что я упускаю? Я не понимаю, почему один и тот же URL работает, если вы попадаете на него, нажав на Nav, но не работает, если вы попадаете на него, нажав на ссылку, для использования которой вам нужно войти в систему. Что-то не так в части URL ?next=? Я думал, что это не должно иметь значения.
Пришлите помощь, я тут с ума схожу, пытаясь заставить это работать.
Возможно, Django ищет неправильное имя шаблона, попробуйте проверить его, возможно, это template_name="registration/login.html" в LoginView.
Также проверьте template_name в том представлении, которое имеет маршрут /groups/join/test-group-1.
Примечание: Я бы рекомендовал добавить в конце каждого маршрута концевую строку
/, поэтому в urls.py:
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = "accounts"
urlpatterns = [
path(
"login/",
auth_views.LoginView.as_view(template_name="accounts/login.html"),
name="login",
),
path("logout/", auth_views.LogoutView.as_view(), name="logout"),
path("signup/", views.SignUp.as_view(), name="signup"),
]