如何让 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 的模板冲突,问题应该会消失。