Расстановка имен в 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. тот же принцип применяется к статическим папкам.

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