如何让 django-oscar 与其他应用程序一起使用?
How to have django-oscar alongside other apps?
我正在尝试将 django-oscar 商店添加到现有的 django 网站。
我的问题是两者的模板有些冲突,以至于我要么可以看到现有网站,要么可以看到商店,但不能同时看到两者。
这是总体urls.py:
from django.conf.urls import include, url
from django.contrib import admin
from oscar.app import application
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('main.urls')),
# oscar
url(r'^shop/', include(application.urls)),
]
并在设置中:
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.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',
'main.context_processors.google_analytics'
],
'loaders': [
'django.template.loaders.app_directories.Loader',
'django.template.loaders.filesystem.Loader',
],
},
},
]
如果我调换加载程序的顺序,原来的网站(在应用程序中 'main')或 Oscar 商店都将不再是 accessed/viewed。所以我不确定我忽略了哪些深奥的细节,文档也没有涵盖这一点。干杯。
您遇到的问题是您的模板名称与 Oscar 的冲突。 Oscar 有它自己的 base.html
,如果您首先列出该加载器而不是您自己的 base.html
,模板加载器将找到它。 Django 将使用它找到的第一个。
这是一个 known issue with Oscar - 不幸的是没有向后兼容的方法来修复它,所以它已经有一段时间没有得到解决了。
更改 Oscar 的行为非常困难,因此我建议您尝试更改模板结构。具体来说,您应该为所有应用程序模板命名空间。因此,如果您的应用名为 myapp
,则将基本模板放在 myapp/templates/myapp/base.html
中。然后,您将在其他模板中将其称为 {% extends 'myapp/base.html' %}
。同样将所有其他模板放入 templates/myapp/
.
这将确保您的模板不会与 Oscar 的模板冲突,问题应该会消失。
我正在尝试将 django-oscar 商店添加到现有的 django 网站。
我的问题是两者的模板有些冲突,以至于我要么可以看到现有网站,要么可以看到商店,但不能同时看到两者。
这是总体urls.py:
from django.conf.urls import include, url
from django.contrib import admin
from oscar.app import application
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('main.urls')),
# oscar
url(r'^shop/', include(application.urls)),
]
并在设置中:
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.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',
'main.context_processors.google_analytics'
],
'loaders': [
'django.template.loaders.app_directories.Loader',
'django.template.loaders.filesystem.Loader',
],
},
},
]
如果我调换加载程序的顺序,原来的网站(在应用程序中 'main')或 Oscar 商店都将不再是 accessed/viewed。所以我不确定我忽略了哪些深奥的细节,文档也没有涵盖这一点。干杯。
您遇到的问题是您的模板名称与 Oscar 的冲突。 Oscar 有它自己的 base.html
,如果您首先列出该加载器而不是您自己的 base.html
,模板加载器将找到它。 Django 将使用它找到的第一个。
这是一个 known issue with Oscar - 不幸的是没有向后兼容的方法来修复它,所以它已经有一段时间没有得到解决了。
更改 Oscar 的行为非常困难,因此我建议您尝试更改模板结构。具体来说,您应该为所有应用程序模板命名空间。因此,如果您的应用名为 myapp
,则将基本模板放在 myapp/templates/myapp/base.html
中。然后,您将在其他模板中将其称为 {% extends 'myapp/base.html' %}
。同样将所有其他模板放入 templates/myapp/
.
这将确保您的模板不会与 Oscar 的模板冲突,问题应该会消失。