【问题标题】:How to have django-oscar alongside other apps?如何将 django-oscar 与其他应用程序一起使用?
【发布时间】:2017-10-30 11:35:50
【问题描述】:

我正在尝试将 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',
            ],
        },
    },
]

如果我切换加载程序的顺序,则无法再访问/查看原始网站(在应用程序“主”中)或 Oscar 商店。所以我不确定我忽略了哪些深奥的细节,并且文档没有涵盖这一点。干杯。

【问题讨论】:

  • 具体出了什么问题 - 模板无法完全加载,还是只是渲染了错误的模板?另外,您有什么模板结构 - 您的基本模板的名称是什么?
  • index.html,继承自 base.html,就是一个很好的例子。当我首先设置 app_directories_loader 访问根目录时,它加载正常。当我切换加载器时,它似乎显示了一个来自 Oscar 的 index.html(内容为空白,但有一个 Oscar favicon)。所以基本上渲染了错误的模板,不知何故它们似乎被命名为相同的。不知道如何解决这个问题,因为 Oscar 模板名称不在我的控制范围内。

标签: django django-oscar


【解决方案1】:

您遇到的问题是您的模板名称与 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 的模板冲突,并且问题应该会消失。

【讨论】:

  • 嗯,我想知道我是否在使用 Oscar 时犯了一个错误。它只是看起来是最受欢迎的商店库,但它让我感到有点笨拙(坦率地说,Django 也是如此,我已经必须为静态文件编写 'main/static/main' 然后 --collectstatic 它们)。如果它们存在并且很受欢迎,我将不得不对其他更简单的库进行更多研究。我想知道我是否应该硬着头皮改用 Rails。
  • 我已经必须为静态文件写 'main/static/main' - 不太清楚你的意思,但听起来你不是做对了。此外,collectstatic 仅用于生产部署。如果您已正确设置项目,则在开发中不需要它。
  • 是的,我花了足够多的时间试图让它在我的机器上的 dev 上运行,就像在生产中一样,所以现在我对两者都做同样的事情。 Collectstatic 将所有应用程序的 /static 文件收集到根 /static 目录中。因此,如果两个应用程序有一个同名的静态文件,那就是冲突。因此主要/静态/主要的东西,实际上是根据文档。
  • 但是感谢您的回答,它修复了它。不幸的是,人们在设计东西时没有遵循 DRY 规则。即使他们明确表示会。 docs.djangoproject.com/en/1.11/misc/design-philosophies/…docs.djangoproject.com/en/1.11/intro/tutorial06.
猜你喜欢
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多