/admin/password_change/ и /accounts/password_change/ используют один и тот же шаблон, если я вручную не укажу некоторые urlpatterns
Проблема
Я использую оба django auth и django admin. После их регистрации в urls.py
, при посещении /accounts/password_change/
и /admin/password_change/
используется один и тот же шаблон. Это не то, что я хочу.
Environment
Ниже приводится схема моего проекта, или, по крайней мере, соответствующие части:
.
+-- config
| +-- settings.py
| +-- urls.py
+-- timelog
| +-- templates
| | +-- registration
| | | +-- password_change_done.html
| | | +-- password_change.html
| | +-- app1
| | | +-- (templates)
| | +-- app1
| | | +-- (templates)
| +-- app1
| +-- app2
+-- manage.py
TEMPLATES
настройка:
from pathlib import Path
ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent
APPS_DIR = ROOT_DIR / "timelog"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [str(APPS_DIR / "templates")],
"APP_DIRS": True,
}
]
urls.py
:
from django.conf.urls import include
from django.contrib import admin
from django.urls import path
urlpatterns = [
path("accounts/", include("django.contrib.auth.urls")),
path("admin/", admin.site.urls),
]
Текущее обходное решение
Единственным решением, которое я нашел, было переопределить /accounts/password_change/
и /accounts/password_change/done/
. Я счел необходимым переименовать шаблоны, чтобы include("django.contrib.auth.urls")
не испортил ситуацию.
Обновлено urls.py
from django.conf.urls import include
from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path
urlpatterns = [
path(
"accounts/password_change/",
auth_views.PasswordChangeView.as_view(template_name="registration/change_password.html"),
name="password_change",
),
path(
"accounts/password_change/done/",
auth_views.PasswordChangeDoneView.as_view(template_name="registration/change_password_done.html"),
name="password_change",
),
path("accounts/", include("django.contrib.auth.urls")),
path("admin/", admin.site.urls),
]
Переименованные шаблоны:
.
+-- timelog
| +-- templates
| | +-- registration
| | | +-- password_change_done.html -> change_password_done.html
| | | +-- password_change.html -> change_password.html
Ключи от urlpatterns в admin и auth
django.contrib.admin.sites.urls
включает следующее urlpatterns
:
urlpatterns = [
path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'),
path(
'password_change/done/',
wrap(self.password_change_done, cacheable=True),
name='password_change_done',
),
# redacted for brevity
]
django.contrib.auth.urls.py
содержит
urlpatterns = [
path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),
# redacted for brevity
]
Я вижу, что оба этих urlpatterns
содержат path
с одинаковыми name
. Я уверен, что возврат reverse("password_change")
зависит от порядка, в котором я поместил вещи в urls.py
.
Ключи из папок шаблонов
django.contrib.admin
имеет папку templates
с registration
в ней. Очевидно, что именно так, когда я не использую django.contrib.auth
в своих урлах, админский сайт все еще позволяет менять пароль.
django.contrib.auth
не имеет папки registration
в templates
.
Что я хочу
Я хочу, чтобы /accounts/password_change/
использовал timelog/templates/registration/password_change.html
, а /admin/password_change/
использовал django/contrib/admin/templates/registration/password_change.html
.