Расстановка имен в Django по-прежнему приводит к коллизиям
У меня есть два приложения, использующие одинаковые имена в моем проекте django. После настройки пространства имен я все еще получаю коллизию. Например, когда я посещаю localhost:8000/nt/
, я получаю шаблон из другого приложения. (localhost:8000/se/ указывает на правильный шаблон).
Я, наверное, что-то упустил. Вот код:
dj_config/urls.py
urlpatterns = [
path("se/", include("simplevent.urls", namespace="se")),
path("nt/", include("nexttrain.urls", namespace="nt")),
# ...
]
dj_apps/simplevent/urls.py
from . import views
app_name = "simplevent"
urlpatterns = [
path(route="", view=views.Landing.as_view(), name="landing")
]
dj_apps/nexttrain/urls.py
from django.urls import path
from . import views
app_name = "nexttrain"
urlpatterns = [
path(route="", view=views.Landing.as_view(), name="landing"),
]
dj_config/settings.py
INSTALLED_APPS = [
"dj_apps.simplevent.apps.SimpleventConfig",
"dj_apps.nexttrain.apps.NexttrainConfig",
# ...
]
TEMPLATES = [
{
# ....
"DIRS": [],
"APP_DIRS": True,
}
Оба представления будут иметь одинаковый код:
class Landing(TemplateView):
template_name = "landing.html"
Шаблоны расположены в:
- dj_apps/simplevent/templates/landing.html
- dj_apps/nexttrain/templates/landing.html
Обратите внимание, что изменение порядка приложений в INSTALLED_APPS изменит проблему (/se
будет указывать на приложение nexttrain).
Обычная структура, которую ожидает ваш бэкенд шаблонов при поиске файлов шаблонов, такова: <your app>/templates/<your app>/some_template.html
, поэтому ваши пути к шаблонам должны быть такими:
dj_apps/simplevent/templates/simplevent/landing.html
dj_apps/nexttrain/templates/nexttrain/landing.html
Django делает это так, потому что когда запускается collectstatic
, он практически копирует файлы из папки templates каждого приложения и помещает их в одну статическую папку. Вот почему имя приложения должно быть дважды в пути. Потому что в конечной папке вы получаете уже существующие имена приложений. Кроме того, вы могли бы в своем приложении переопределить шаблоны из сторонних приложений (например, admin). Для меня это звучит слишком запутанно, но я уверен, что именно так и предполагается разделять шаблоны
Также, по вашему мнению, при указании опции template_name
необходимо указывать имя приложения:
# simplevent app
class Landing(TemplateView):
template_name = "simplevent/landing.html"
# nexttrain app
class Landing(TemplateView):
template_name = "nexttrain/landing.html"
PS. тот же принцип применяется к статическим папкам.