如何向 django-oscar 添加新视图

Posted

技术标签:

【中文标题】如何向 django-oscar 添加新视图【英文标题】:How to add a new view to django-oscar 【发布时间】:2020-09-10 12:05:24 【问题描述】:

我认为我没有完全掌握 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.pymyapp 是根据 django-oscar 教程创建的,该教程涉及运行命令 ./manage.py oscar_fork_app order myapp

文件夹的一般分类:

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

myproject 中的我的 urls.py 如下所示:

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

【问题讨论】:

【参考方案1】:

如果它只是您想要覆盖的索引视图,那么在 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 匹配到奥斯卡之前。

或者,您需要覆盖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

【讨论】:

谢谢。我不明白它的外观。我盲目地关注那部分的文档。这解决了我的问题,让我有了更好的理解。非常感谢。【参考方案2】:

索引在: 奥斯卡/应用程序/目录/apps.py

你必须分叉目录

【讨论】:

以上是关于如何向 django-oscar 添加新视图的主要内容,如果未能解决你的问题,请参考以下文章

如何向 UICollectionView 动态添加新单元格?

如何将我的新视图添加到情节提要?

如何在 iOS 中异步向 UITableViewCell 添加视图?

如何创建 django-oscar 产品类作为数据迁移

如何将按钮添加到“扩展视图”类?

Eclipse - 如何添加新的 MariaDB 连接