在django项目中放置模板的最佳位置是什么?

在django项目中放置模板的最佳位置是什么?,django,Django,在django项目中放置模板的最佳位置是什么 如果你想不出一个明显的地方 要放置模板,我们建议 在中创建模板目录 您的Django项目(即在 您在中创建的mysite目录 第二章,如果你一直遵循 连同我们的例子) 这正是我所做的,对我来说非常有效 我的目录结构如下所示: TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [],

在django项目中放置模板的最佳位置是什么

如果你想不出一个明显的地方 要放置模板,我们建议 在中创建模板目录 您的Django项目(即在 您在中创建的mysite目录 第二章,如果你一直遵循 连同我们的例子)

这正是我所做的,对我来说非常有效

我的目录结构如下所示:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]
/media
用于所有我的CSS/JS/图像等
/templates
用于我的模板

/projectname
对于主项目代码(即Python代码)

这在项目级别上更像是个人的选择。如果你说的是需要可插拔的应用程序,那么应用程序中的模板目录就是它们的默认位置。但是在项目范围内,这是最适合你的。

你也可以考虑使用数据库中的模板。它也是为缓存和django恢复应用程序而设置的,django恢复应用程序可以帮助您保留旧版本的模板

它工作得很好,但我更希望在文件系统的导入/同步方面有一点灵活性

[编辑:2018年8月20日-此存储库不可用,具有相同名称的存储库在上可用,并在8个月前进行了更新。我不再以任何有意义的方式使用Django,因此无法对此进行担保。]

放置在
//templates//template.html
中,用于特定于应用程序的模板,以帮助使应用程序在其他地方可重用


对于一般的“全局”模板,我将它们放在Dominic和dlrust的后续
/templates/template.html

我们使用setuptools源代码分发(sdist)来打包django项目和应用程序,以便在不同的环境中部署

我们发现模板和静态文件需要位于django应用程序目录下,以便可以通过setuptools打包

例如,我们的模板和静态路径如下所示:

PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js
为此,需要修改MANIFEST.in(请参阅)

MANIFEST.in的一个示例:

include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg
此外,您需要在django设置文件中确认app\u目录加载程序位于模板加载程序中。我认为在Django1.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不变。

我理解
TEMPLATE\u DIRS
需要一个绝对路径。我不喜欢代码中的绝对路径。 因此,在
settings.py中,这对我来说非常有效:

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)

以前的解决方案在我的案例中不起作用。我用过:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]

Django 1.10

模板目录
已弃用

现在我们需要使用
模板
,如下所示:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]
定义模板后,可以安全地删除允许的\u INCLUDE\u根、模板\u上下文\u处理器、模板\u调试、模板\u目录、模板\u加载器,以及模板\u字符串(如果\u无效)

关于最佳位置,Django正在寻找如下模板:

  • DIRS定义一个目录列表,引擎应在其中按搜索顺序查找模板源文件
  • APP_DIRS告诉引擎是否应该在已安装的应用程序中查找模板。每个后端为应用程序中应存储其模板的子目录定义一个常规名称
更多信息: DJANGO 1.11

添加manage.py所在的templates文件夹,该文件夹是您的基本目录。 在settings.py中更改模板的目录,如下所示

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来说非常有效,不知道在
//templates//template.html中使用2个
的原因是什么?第一个/app/templates只是将模板与其相关的应用程序分组。第二个应用程序是防止名称冲突。(想必,您会将TEMPLATE_DIRS指向这些目录中的每一个,但最终,Django会将它们合并到一个巨大的目录中。)请参见:为了使这项工作(Django 1.6),我必须为文件系统模板加载器添加指令:
TEMPLATE_DIRS=(os.path.join(BASE_DIR,“templates”)
这个答案很古老,但不知怎的,我最终来到了这里。作为记录,
TEMPLATE\u DIRS
现在已被弃用-您应该将
DIRS=[os.path.join(BASE\u DIR,“templates”)]
添加到
templates
-请参见何时将模板放入/templates中,有没有一种方法可以告诉模板加载器加载它,而不指定要用django.template.loaders.filesystem.loader加载的template_DIRS中/template的完整路径?使用相对路径执行此操作将非常好,在1.4下,我的加载程序不会在/templates+1下查找。感谢您提供额外的详细信息和示例行。+1在考虑模板和模块化应用程序时,将
/static/
包括在布局图中是明智的。您可能想提到另一个最佳实践,将
css
文件放在名为
static/app/css
的文件夹中,同样适用于
js
,也可能是
jpg
或只是
/static/app/images
。这什么时候是个好主意?从DB加载模板不是更慢吗?如果你在DB中存储模板,你不会变得依赖DB吗?你会让DB成为git提交的一部分吗?您将如何协调模板中不同用户所做的更改?这是在我意识到git之前编写的。甚至不确定我当时是否在使用svn。我建议现在就使用版本控制系统。@tonemcd,此存储库已被删除。请看我的