如何在Django的不同目录中调用具有相同名称的模板?

时间:2015-05-10 08:44:20

标签: python django templates

使用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,

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

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

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

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

mysite/app/templates/app/base.html

如果应用程序位于已安装的应用程序元组中,则TEMPLATE DIR中不需要

os.path.join(BASE_DIR, 'app/templates')

欢迎使用更高效的Django 1.8解决方案。

2 个答案:

答案 0 :(得分:5)

使用您当前的目录结构,您不能 - 这样做可以让您稍后在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获取另一个 - 相关的应用模板都打包在他们引用的应用程序中,但是是命名空间。

答案 1 :(得分:3)

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