为 django 包添加模板文件夹选择

问题描述 投票:0回答:2

我对 django 比较陌生,正在寻求有关自定义包模板管理的帮助。

在工作中,我们使用自制的自定义 django 包,将其添加到主项目中已安装的应用程序中。该软件包包含工具和实用程序,以及我们在主要项目中派生的基本模板。

有什么变化?我们需要更新前端并更改库,这会影响此自定义包中的模板。

为了避免增加自定义包分支和版本(我们已经有几个用于不同版本的 django),并且考虑到我们现有应用程序中的模板不会立即全部更新,我们希望这样做主项目将使用旧模板或新版本模板(变量选择或默认)。

我的目标(如果可能的话):

  • 在项目将查找的自定义包模板文件夹中添加文件夹级别
  • 添加一个变量(例如在项目的settings.py文件中)来指示主项目需要在包中查找哪个模板文件夹
  • 无需修改包中的旧模板文件夹或应用程序中的旧模板。例如,必须在此包中执行与安全性相关的关键更新不应要求基于旧模板更新现有项目中的所有模板)。

我已经研究了 django-crispy-forms 包如何选择引导版本,但据我了解,它系统地呈现了一个项目的视图,给出了模板包的精度,在我看来,这需要一个巨大的总的来说,我们的基本应用程序模板源自自定义包模板,带有简单的 {% extends "custom_package/templatename.html" %}

我也尝试过理解 django 加载器,但我承认我也不确定这是否是正确的方法,尽管阅读了这方面的 django 文档,我仍然发现它们有点神秘并且不知道如何我会为了我们的特定目的而这样做。

也许我在 django-crispy-forms 中遗漏了一些东西吗?或者装载机是否是一个相关/更好的角度?如果是,你会如何向邻居的 10 岁孩子解释它们?您是否有其他选择可以帮助实现我们的目标?

如有任何帮助,我们将不胜感激!

更新

@Helge 你的意思是 TEMPLATE_DIRS 而不是 STATICFILES_DIR 吗?不过,自 Django 1.8 以来,它已被弃用。也就是说,我很想将包的模板文件夹添加到 TEMPLATES 中的 DIRS 项,但我找不到如何操作。我的包不在站点包中,也不直接在我的项目文件夹中。

以下是 TemplateDoesNotExist 错误引发的示例:

/home/myusername/myapps/thisproject/src/web/thisproject/templates/xyz/base.html (Skipped)
/home/myusername/.pyenv/versions/3.7.6/envs/thisproject.3.7.6/src/MYCUSTOMPACKAGE/src/templates/xyz/base.html (Source does not exist)
/home/myusername/.pyenv/versions/thisproject.3.7.6/lib/python3.7/site-packages/crispy_forms/templates/xyz/base.html (Source does not exist)

基本上我试图让 django 根据设置中指示的变量在这里查找子文件夹:.../MYCUSTOMPACKAGE/src/templates/SUBFOLDER/xyz/base.html

你能帮我做一下吗?

python django django-templates
2个回答
0
投票

如果您希望 django 尽可能使用您的模板,并在需要时使用具有相同名称的模板,这个答案将会有所帮助。

Django 有一个 FileSystemFinder,它将在

TEMPLATE_DIRS
中搜索模板。如果您在 TEMPLATE_DIRS 中的其他应用程序之前注册您的应用程序,django 将首先找到您应用程序的模板并尽可能使用它们。

更新:

如果您使用的是较新版本的 Django,您可能需要将其添加到 TEMPLATES 下的 settings.py 内的 DIRS 列表中。

首先在设置文件中定义 BASE_DIR。如果您的文件位于 yourapp/settings.py 中,则将其定义为

import os

BASE_DIR = dirname(os.path.abspath(__file__))  # Folder of settings.py

然后您可以将目录添加到模板中:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR,  'src/templates/SUBFOLDER/xyz/base.html')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

0
投票

如果您想将 HTML 文件保存在通用文件夹中,您可以在项目的主目录中创建该文件夹并将其命名为“templates”。然后,在模板的 DIRS 部分下的设置中,只需添加以下代码:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

无需导入操作系统:)

© www.soinside.com 2019 - 2024. All rights reserved.