如何向 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
我认为我没有完全掌握 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