【发布时间】:2010-12-16 23:03:51
【问题描述】:
在 django 项目中放置模板的最佳位置是什么?
【问题讨论】:
标签: django
在 django 项目中放置模板的最佳位置是什么?
【问题讨论】:
标签: django
放置在<PROJECT>/<APP>/templates/<APP>/template.html 以获取特定于应用程序的模板,以帮助使应用程序可在其他地方重复使用。
对于一般的“全局”模板,我将它们放在<PROJECT>/templates/template.html
【讨论】:
<PROJECT>/<APP>/templates/<APP>/template.html中有2个<APP>s的原因吗?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS 现在已弃用 - 您应该将 DIRS=[os.path.join(BASE_DIR, "templates")] 添加到 TEMPLATES - 请参阅 stackoverflow.com/questions/29725132/…
来自 Django 书籍,chapter 4:
如果你想不出一个明显的地方 放置您的模板,我们建议 在其中创建模板目录 您的 Django 项目(即,在 您在其中创建的 mysite 目录 第 2 章,如果你一直在关注 以及我们的示例)。
这正是我所做的,对我来说效果很好。
我的目录结构如下所示:
/media 用于我的所有 CSS/JS/图像等/templates 用于我的模板/projectname 用于主要项目代码(即 Python 代码)
【讨论】:
由 Dominic 和 dlrust 跟进,
我们使用 setuptools 源代码分发 (sdist) 来打包我们的 django 项目和应用程序以部署在我们不同的环境中。
我们发现模板和静态文件需要在django应用目录下才能被setuptools打包。
例如,我们的模板和静态路径如下所示:
PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
为此,需要修改 MANIFEST.in(请参阅http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template)
MANIFEST.in 的一个例子:
include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
另外,您需要在您的 django 设置文件中确认 app_directories 加载器在您的 TEMPLATE_LOADERS 中。我认为它在 django 1.4 中默认存在。
django 设置模板加载器示例:
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
以防万一您想知道为什么我们使用 sdists 而不仅仅是处理 rsync 文件;它是我们配置管理工作流程的一部分,我们有一个构建 tarball,在 PIP 未更改的情况下部署到测试、验收和生产环境中。
【讨论】:
/static/ 包含在您的布局计划中是明智的。您可能想提及另一个最佳实践,将css 文件放在名为static/app/css 的文件夹中,同样适用于js,也可能是jpg,或者只是/static/app/images。
DJANGO 1.11
在 manage.py 所在的位置添加模板文件夹,这是您的基本目录。 在您的 settings.py 中更改模板的 DIRS,如下所示
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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',
],
},
},
]
现在通过代码来使用模板,
def home(request):
return render(request,"index.html",{})
在views.py中。 这对 django 1.11 完全正常
【讨论】:
这更多是项目级别的个人选择。如果您正在谈论需要可插拔的应用程序,那么您的应用程序中的模板目录就是它们默认的位置。但在整个项目范围内,它是最适合您的。
【讨论】:
我了解TEMPLATE_DIRS 需要绝对路径。而且我不喜欢我的代码中的绝对路径。
所以这对我来说很有效,settings.py:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
【讨论】:
BASE_DIR,因此您可以将其简化为:os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10
TEMPLATE_DIRS 已弃用。
现在我们需要像这样使用TEMPLATE、introducing in Django 1.8:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
一旦定义了 TEMPLATES,您就可以安全地删除 ALLOWED_INCLUDE_ROOTS、TEMPLATE_CONTEXT_PROCESSORS、TEMPLATE_DEBUG、TEMPLATE_DIRS、TEMPLATE_LOADERS 和 TEMPLATE_STRING_IF_INVALID。
关于最佳位置,Django 正在寻找这样的模板:
更多信息: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
【讨论】:
以前的解决方案不适用于我的情况。我用过:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
【讨论】:
TEMPLATE_DIRS 现已弃用。
BASE_DIR,因此您可以将其简化为:os.path.join(BASE_DIR, '../myapp/templates')
您还可以考虑使用django-dbtemplates 将模板保存在数据库中。它还设置为缓存,以及 django-reversion 应用程序,可帮助您保留旧版本的模板。
它工作得很好,但我希望在导入/同步到/从文件系统方面更加灵活。
[编辑:2018 年 8 月 20 日 - 此存储库不可用,同名的存储库可在 https://github.com/jazzband/django-dbtemplates 获得,并于 8 个月前更新。我不再以任何有意义的方式使用 Django,所以不能保证这一点。]
【讨论】: