我目前正在建立一个基于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")
答案 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',
],
},
},
]
现在,您可以通过
放置和使用模板了project_dir/templates/local
或project_dir/templates/oscar
或project_dir/templates/
对于任何相交的模板文件
两者(例如:main base.html)。如果必须使用多个模板目录,则更易于阅读和清洁代码。