/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.

Вернуться на верх