我对 django 比较陌生,正在寻求有关自定义包模板管理的帮助。
在工作中,我们使用自制的自定义 django 包,将其添加到主项目中已安装的应用程序中。该软件包包含工具和实用程序,以及我们在主要项目中派生的基本模板。
有什么变化?我们需要更新前端并更改库,这会影响此自定义包中的模板。
为了避免增加自定义包分支和版本(我们已经有几个用于不同版本的 django),并且考虑到我们现有应用程序中的模板不会立即全部更新,我们希望这样做主项目将使用旧模板或新版本模板(变量选择或默认)。
我的目标(如果可能的话):
我已经研究了 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
你能帮我做一下吗?
如果您希望 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',
],
},
},
]
如果您想将 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',
],
},
},
]
无需导入操作系统:)