【问题标题】:How do I call templates with same names at different directories in Django?如何在 Django 的不同目录中调用具有相同名称的模板?
【发布时间】:2015-05-10 19:06:59
【问题描述】:

使用 Django 1.8

我有两个同名的模板,

base.html/mysite/templates/base.html

另一个来自位置相同的应用 (base.html), /mysite/app/templates/base.html

我的模板设置,

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):
    c = { name: 'myname', username: 'myusername'}
    return render(request, 'base.html', c)

这会从项目根目录调用“base.html”,但是如何从app/template 目录调用模板。

感谢您的任何参考!

更新:

我已将应用位置添加到模板目录中,

'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'app/templates')],

现在我的 IDE 显示了这两个文件,但仍呈现根的 base.html。如何引用一个模板而不是另一个模板?

更新: 修复了在应用模板级别添加了一个目录。

现在我的应用模板目录结构如下所示,

mysite/app/templates/app/base.html

如果应用在已安装的应用元组中,则在 TEMPLATE DIR 中不需要os.path.join(BASE_DIR, 'app/templates')

欢迎在 Django 1.8 上提供更高效的解决方案。

【问题讨论】:

    标签: python django templates


    【解决方案1】:

    使用您当前的目录结构,您不能 - 这样做是为了让您稍后在 INSTALLED_APPS 设置中通过应用程序覆盖模板。惯例是使用一个目录结构,更像:

    app1/templates/app1/base.html
    app2/templates/app2/base.html
    

    然后使用app1/base.htmlapp2/base.html 来引用您想要的那个。

    编辑

    为了更清楚我的意思:您的项目结构可能如下所示:

    mysite
        - templates
            - base.html
        - manage.py (etc...)
        - app
            - models.py (etc...)
            - templates
                - app
                    - base.html
    

    然后您可以使用base.html 获取第一个并使用app/base.html 获取另一个 - 相关的应用程序模板都打包在它们引用的应用程序中,但具有命名空间。

    【讨论】:

    • 设置中有APP_DIRS,我猜这是最酷的方式,如果模板名称不同,效果很好。
    • 我想你误会了我。我的意思是在应用程序 inside 的模板目录中使用应用程序的名称...在项目级别不是全局的。当然,您会始终将模板与您的应用打包在一起!!
    【解决方案2】:

    在文件结构中创建额外级别是一种很好的做法。所以将模板放在templates/<app_name>/ 文件夹中。然后您可以使用templates/app1/base.htmltemplates/app2/base.html 引用它们。

    【讨论】:

    • 是的。它被称为命名空间。这是在几个关键 django 元素(url、模板等)上使用的最佳实践。见docs.djangoproject.com/en/1.8/intro/tutorial03
    • 感谢您的推荐,虽然我更喜欢紧凑的应用程序,因此移动它们不需要从 templates/app/* 移动文件,只需移动应用程序即可。
    • 查看我对我的回答的评论 - 我想你误解了我们俩。
    • 我认为这里可能存在误解:即使在应用程序下也应该使用命名空间:例如<appname>/templates/<appname>/whatevertemplate.html。原因是 Django 如何在每个应用程序下查找模板。为了避免发现中的冲突/错误顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多