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


88

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

Answers:


50

从Django的书中,第4章

如果您想不到放置模板的明显位置,建议您在Django项目中创建一个模板目录(即,如果您一直跟随我们的示例,请在第2章中创建的mysite目录中)。

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

我的目录结构如下所示:

/media用于我所有的CSS / JS / images等
/templates
/projectname用于主项目代码(即Python代码)的模板


1
当您将模板放在/ templates中时,是否有一种方法可以告诉模板加载器加载它,而无需在TEMPLATE_DIRS中指定/ template的完整路径来通过django.template.loaders.filesystem.Loader加载?最好使用相对路径来完成此操作,并且在1.4以下,我的装载机不在<project> / templates下寻找
Ciro Santilli郝海东冠状病六四事件法轮功

87

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

对于一般的“全局”模板,我将其放入 <PROJECT>/templates/template.html


11
想知道2<APP>秒之内的原因<PROJECT>/<APP>/templates/<APP>/template.html吗?
大卫·夏

18
第一个/ app / templates只是将模板与其相关的应用分组。第二个应用程序是防止名称冲突。(大概,您将TEMPLATE_DIRS指向每个目录,但是最后,Django将它们合并到一个大目录中。)请参阅:docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista 2012年

3
为此(Django 1.6),我必须为文件系统模板加载器添加指令:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman 2014年

3
这个答案很古老,但是我最终还是以这种方式结束了。根据记录,TEMPLATE_DIRS现在已经过时-你应该改为添加DIRS=[os.path.join(BASE_DIR, "templates")]TEMPLATES-看stackoverflow.com/questions/29725132/...
约翰·艾伦

9

跟着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却未更改地部署到测试,验收和生产环境中。


1
+1感谢您提供额外的详细信息和示例行。
gotgenes 2012年

/static/考虑模板和模块化应用时,+ 1智能可将其包含在布局计划中。您可能要提到另一种最佳做法,将css文件放在一个名为static/app/cssforjs和也许jpg或者只是的文件夹中/static/app/images
滚刀

7

丹哥1.11

在manage.py存在的地方添加模板文件夹,这是您的基本目录。在您的settings.py中按以下所示更改TEMPLATES的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完全正常


1

在项目级别,这是个人选择。如果您在谈论需要可插拔的应用程序,则应用程序中的模板目录是它们默认放置的位置。但是在整个项目范围内,这才是最适合您的。


1

我了解TEMPLATE_DIRS需要一条绝对的道路。而且我不喜欢代码中的绝对路径。所以这对我来说很好,在settings.py

import os

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

1
Django项目的基本路径已经在标准settings.py中定义为BASE_DIR,因此您可以将其简化为:os.path.join(BASE_DIR, '../APPNAME/templates')
ngoue

1

Django 1.10

TEMPLATE_DIRS 不推荐使用。

现在我们需要使用TEMPLATE在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寻找这样的模板:

  • DIRS定义了目录列表,引擎应在目录中按搜索顺序查找模板源文件。
  • APP_DIRS告知引擎是否应在已安装的应用程序内查找模板。每个后端为应在内部存储其模板的应用程序中的子目录定义一个常规名称。

详细信息:https : //docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

在我的情况下,以前的解决方案不起作用。我用了:

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

看我的答案。TEMPLATE_DIRS现在已弃用。
威尔弗里德'02

Django项目已经在标准settings.py中将其基本路径定义为BASE_DIR,因此您可以将其简化为:os.path.join(BASE_DIR, '../myapp/templates')
ngoue

0

您也可以考虑使用django-dbtemplates将模板存储在数据库中。它还设置用于缓存,以及django-version应用程序,可帮助您保留模板的旧版本。

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

[编辑:2018年8月20日-该存储库不可用,同一个名称的存储库可在https://github.com/jazzband/django-dbtemplates获得,并于8个月前更新。我不再以任何有意义的方式使用Django,因此无法保证。


什么时候是个好主意?从数据库加载模板会不会更慢?
jguffey 2014年

如果您将模板存储在db中,那么您是否会变得不依赖db,是否会使db成为git commit的一部分?您如何在模板中由不同用户进行的更改之间进行协调?
gautamaggarwal

这是在我意识到git之前写的。甚至不确定我当时使用的是svn。我建议现在使用版本控制系统。
TonyM '18年

@tonemcd,此存储库已删除。
lmiguelvargasf '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.