将Django指向不同的模板目录

时间:2017-07-26 03:55:57

标签: python django templates django-templates django-oscar

我目前正在建立一个基于Django-Oscar的Django电子商务网站。默认情况下,后者带有基本的Bootstrap主题和样式。

我将这些模板文件移到

project_root/templates/oscar

我的理解是,如果我要覆盖这些模板,它将覆盖位于virtualenv中的原始Oscar模板。

下一步是我下载了一个我想用于该网站的不同主题。

特别是,我希望该主题位于

project_root/templates/main_theme

麻烦的是,我似乎无法让Django从该目录中获取模板。如果我删除project_root/templates/oscar,它似乎会返回默认的奥斯卡模板。

如果我将base.html放入project_root/templates/并将base.html作为新主题的主文件,则会显示该文件。但是,我仍然希望将其分解为较小的文件,并将它们“实时”放在一个单独的目录中。我怎么能做到这一点?是否有更谨慎的方式来解决这个问题?

以下是一些相关设置:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.flatpages',
    'django.contrib.sites',

    'compressor',
    'widget_tweaks',
] + get_core_apps()

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
            OSCAR_MAIN_TEMPLATE_DIR,
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',

                'oscar.apps.search.context_processors.search_form',
                'oscar.apps.promotions.context_processors.promotions',
                'oscar.apps.checkout.context_processors.checkout',
                'oscar.apps.customer.notifications.context_processors.notifications',
                'oscar.core.context_processors.metadata',
            ],
        },
    },
]

COMPRESS_ROOT = os.path.join(BASE_DIR, "static")

STATIC_URL = '/static/'

#STATIC_ROOT = os.path.join(BASE_DIR, "static")

#This should be commented out in Development
STATICFILES_DIRS = [
  os.path.join(BASE_DIR, "static"),
]

MEDIA_URL = "/media/"

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

2 个答案:

答案 0 :(得分:1)

以下代码对我有用。事实证明,需要在DIR列表的TEMPLATES列表中指定其他条目。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),

            #re-route the search for templates into this custom template directory
            os.path.join(os.path.join(BASE_DIR, 'templates'), 'tshirt-theme'),

            #Uncomment the line below to restore the original Oscar template
            #OSCAR_MAIN_TEMPLATE_DIR,
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',

                'oscar.apps.search.context_processors.search_form',
                'oscar.apps.promotions.context_processors.promotions',
                'oscar.apps.checkout.context_processors.checkout',
                'oscar.apps.customer.notifications.context_processors.notifications',
                'oscar.core.context_processors.metadata',
            ],
        },
    },
]

答案 1 :(得分:0)

您还可以将目录的不同路径分配为变量:

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates/local')
OSCAR_TEMP_DIR = os.path.join(BASE_DIR, 'templates/oscar')
TEMP_DIR = os.path.join(BASE_DIR, 'templates')

然后在settings.py的“模板”部分中,将这些变量分配给Directory arg。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATES_DIR, OSCAR_TEMP_DIR, TEMP_DIR],
        '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',

                'oscar.apps.search.context_processors.search_form',
                'oscar.apps.checkout.context_processors.checkout',
                'oscar.apps.customer.notifications.context_processors.notifications',
                'oscar.core.context_processors.metadata',
            ],
        },
    },
]

现在,您可以通过

放置和使用模板了
  1. project_dir/templates/local
  2. project_dir/templates/oscar
  3. project_dir/templates/对于任何相交的模板文件 两者(例如:main base.html)。

如果必须使用多个模板目录,则更易于阅读和清洁代码。

相关问题