如何向 django-oscar 添加新视图

How to add a new view to django-oscar

我认为我没有完全掌握 django-oscar 文档。我正在尝试添加一个新视图,即站点 / 处的主视图。但是无论我做什么,当我想访问 / 时,它都会继续 /catalogue/

它说我应该执行以下操作:

from oscar.apps.offer.apps import OfferConfig as CoreOfferConfig
from .views import IndexView
from django.conf.urls import url


class OfferConfig(CoreOfferConfig):
    def ready(self):
        super().ready()
        self.index_view = IndexView

    def get_urls(self):
        urls = super().get_urls()
        urls += [
            url(r'^$', self.index_view.as_view(), name='index'),
        ]
        return self.post_process_urls(urls)

这是在 myproject/myapp/offer/apps.py 中。 myapp 是根据 django-oscar 教程创建的,其中涉及 运行 命令 ./manage.py oscar_fork_app order myapp.

文件夹的一般分类:

myproject:
    - myproject
        - settings.py
        ...
    - static
    - myapp
        - order
        - offer
            - apps.py
        - __init.py
    - templates
    manage.py

我的 urls.py 在 myproject 中看起来如下:

from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url
from django.conf.urls.static import static
from django.conf import settings
from django.apps import apps

urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
    url(r'^', include(apps.get_app_config('oscar').urls[0])),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

目前我尝试添加的视图非常非常基础:

from django.views.generic import TemplateView


class IndexView(TemplateView):
    template_name = "pages/index.html"

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        products = ['empy', 'for', 'now']
        context.update({
            'products': products,
        })
        return context

我做错了什么?

我正在使用 django-oscar 2.0.4,django 2.2.12,python 3.7.4

索引位于: oscar/apps/catalogue/apps.py

你必须 fork 目录

如果您只是想覆盖索引视图,那么在 Oscar 的模式中插入 URL 模式可能更容易:

urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
    path('', IndexView.as_view()),
    url(r'^', include(apps.get_app_config('oscar').urls[0])),
]

这将使您的 IndexView 比 Oscar 的先匹配。

或者,您需要覆盖 catalogue 应用程序 where the home page view is defined。在您的问题中,您分叉了 offer 应用程序,该应用程序不包含该视图,因此您的更改无效。如果您采用这种方法,那么覆盖视图的正确方法是在应用程序的 ready() 方法中设置 self.catalogue_view,而不是添加新的 URL 模式:

class CatalogueConfig(CoreCatalogueConfig):
    def ready(self):
        super().ready()
        # This is all - you don't need to mess with the URLs.
        self.catalogue_view = IndexView