Django命名空间仍然会产生冲突

7xllpg7q  于 2023-01-27  发布在  Go
关注(0)|答案(1)|浏览(120)

我的django项目中有两个应用程序使用相同的名称。配置了名称空间后,我仍然会遇到冲突。例如,当我访问localhost:8000/nt/时,我从另一个应用程序中获取模板。(localhost:8000/se/ points to right template)。
我一定是漏掉了什么。下面是代码:

  • dj_配置/urls.py*
urlpatterns = [
    path("se/", include("simplevent.urls", namespace="se")),
    path("nt/", include("nexttrain.urls", namespace="nt")),
    # ...
]
  • DJ应用程序/简单事件/urls.py*
from . import views

app_name = "simplevent"

urlpatterns = [
    path(route="", view=views.Landing.as_view(), name="landing")
]
  • dj应用程序/下一列车/urls.py*
from django.urls import path
from . import views

app_name = "nexttrain"

urlpatterns = [
    path(route="", view=views.Landing.as_view(), name="landing"),
]
  • dj_配置/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应用程序)。

p8h8hvxi

p8h8hvxi1#

在查找模板文件时,模板后端所期望的通常结构是:<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文件夹中复制文件,并将其放置在一个静态文件夹中。这就是为什么应用名称需要在路径中出现两次的原因。因为在最后一个文件夹中,应用名称已经在那里了。你可以在你的应用程序中覆盖第三方应用程序(如管理员)的模板。这听起来有点太复杂了,但我很肯定这是你应该分开模板的预期方式。
此外,在您的视图中,指定template_name选项时,您需要具有应用名称:

# simplevent app
class Landing(TemplateView):
    template_name = "simplevent/landing.html"

# nexttrain app
class Landing(TemplateView):
    template_name = "nexttrain/landing.html"

PS.同样的原理也适用于静态文件夹。

相关问题