【问题标题】:What is the best location to put templates in django project?在 django 项目中放置模板的最佳位置是什么?
【发布时间】:2010-12-16 23:03:51
【问题描述】:

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

【问题讨论】:

    标签: django


    【解决方案1】:

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

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

    【讨论】:

    • 想知道<PROJECT>/<APP>/templates/<APP>/template.html中有2个<APP>s的原因吗?
    • 第一个 /app/templates 只是将模板与其相关的应用程序分组。第二个应用程序是防止名称冲突。 (大概,您将指向 TEMPLATE_DIRS 以指向这些目录中的每一个,但最后,Django 将它们集中到一个巨大的目录中。)请参阅:docs.djangoproject.com/en/dev/ref/templates/api/…
    • 为了让它工作(django 1.6),我必须为文件系统模板加载器添加指令:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
    • 这个答案很古老,但不知何故我到了这里。作为记录,TEMPLATE_DIRS 现在已弃用 - 您应该将 DIRS=[os.path.join(BASE_DIR, "templates")] 添加到 TEMPLATES - 请参阅 stackoverflow.com/questions/29725132/…
    【解决方案2】:

    来自 Django 书籍,chapter 4:

    如果你想不出一个明显的地方 放置您的模板,我们建议 在其中创建模板目录 您的 Django 项目(即,在 您在其中创建的 mysite 目录 第 2 章,如果你一直在关注 以及我们的示例)。

    这正是我所做的,对我来说效果很好。

    我的目录结构如下所示:

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

    【讨论】:

    • 当您将模板放入 /templates 时,有没有办法告诉模板加载器加载它,而无需在 TEMPLATE_DIRS 中指定 /template 的完整路径以使用 django.template.loaders.filesystem 加载。装载机?使用相对路径执行此操作会很棒,并且在 1.4 下,我的加载器不在 /templates 下查看
    【解决方案3】:

    由 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 在考虑模板和模块化应用程序时,将/static/ 包含在您的布局计划中是明智的。您可能想提及另一个最佳实践,将css 文件放在名为static/app/css 的文件夹中,同样适用于js,也可能是jpg,或者只是/static/app/images。
    【解决方案4】:

    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 完全正常

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我了解TEMPLATE_DIRS 需要绝对路径。而且我不喜欢我的代码中的绝对路径。 所以这对我来说很有效,settings.py:

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

        【讨论】:

        • Django 项目的基本路径已在标准 settings.py 中定义为 BASE_DIR,因此您可以将其简化为:os.path.join(BASE_DIR, '../APPNAME/templates')
        【解决方案7】:

        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 正在寻找这样的模板:

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

        更多信息: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration

        【讨论】:

          【解决方案8】:

          以前的解决方案不适用于我的情况。我用过:

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

          【讨论】:

          • 看我的回答。 TEMPLATE_DIRS 现已弃用。
          • Django 项目的基本路径已在标准 settings.py 中定义为 BASE_DIR,因此您可以将其简化为:os.path.join(BASE_DIR, '../myapp/templates')
          【解决方案9】:

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

          它工作得很好,但我希望在导入/同步到/从文件系统方面更加灵活。

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

          【讨论】:

          • 什么时候是个好主意?从数据库加载模板不是更慢吗?
          • 如果你将模板存储在 db 中,你不会变得依赖 db,而且你会让你的 db 成为 git 提交的一部分吗?您将如何协调不同用户在模板中所做的更改?
          • 这是在我意识到 git 之前写的。甚至不确定我当时使用的是 svn。我建议现在使用版本控制系统。
          • @tonemcd,此存储库已被删除。
          猜你喜欢
          • 2015-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-12
          • 1970-01-01
          • 1970-01-01
          • 2014-02-05
          相关资源
          最近更新 更多