由于您没有为自定义提供任何 views.py 预览,因此很难解释和解决您的问题。但我会解释如何分叉或自定义任何 django oscar 应用程序/模型/视图。
为了自定义模型、视图和 url,您需要 fork 模型/视图所在的 Oscar 核心应用。然后你应该能够覆盖任何模型/视图类。
派生/自定义应用程序的步骤:
-
如果您是第一次分叉 Oscar 应用,那么您必须创建一个根应用文件夹,其中所有分叉的应用都将存在:
$ mkdir yourapps 文件夹
$ touch yourappsfolder/init.py
创建一个与 Oscar 应用具有相同“app-label”的 python 模块:
例如:自定义 oscar.apps.catalogue 应用
$ mkdir yourappsfolder/catalogue
$ touch yourappsfolder/catalogue/__init__.py
-
如果 Oscar 应用有 models.py,那么您必须在本地应用中创建一个 models.py 文件。
您的自定义模型放在这里
从 oscar.apps.catalogue.models 导入 *
注意:要自定义 Oscar 模型,您必须在导入 Oscar 模型之前添加自定义模型。然后,你的模型文件将在一个应用程序中有两个同名的模型,Django 只会使用第一个。
例如:向产品模型添加活动字段:
# yourappsfolder/catalogue/models.py
from django.db import models
from oscar.apps.catalogue.abstract_models import AbstractProduct
class Product(AbstractProduct):
active = models.BooleanField(default=False)
from oscar.apps.catalogue.models import *
-
在您的本地应用程序中创建一个“admin.py”文件。
yourappsfolder/catalogue/admin.py
从 oscar.apps.catalogue.admin 导入 *
然后从 oscar/apps/catalogue 复制“迁移”目录并将其放入新的本地目录应用程序中。
-
通过在 INSTALLED_APPS 中将 Oscar 的应用替换为您自己的应用,将其添加为 Django 应用。
settings.py
从奥斯卡导入 get_core_apps
安装应用程序 = [
...,
# 你所有的非奥斯卡应用
] + get_core_apps(['yourappsfolder.catalogue'])
注意:get_core_apps([]) 将返回 Oscar 核心应用列表,否则如果您提供自定义应用列表,它们将替换 Oscar 核心应用。
- 最后,使用“makemigrations”管理命令创建迁移,并使用“migrate catalogue”管理命令应用迁移。然后,您可以看到产品模型中添加了一个新列。
自定义 URL 的步骤:
按照上述自定义应用程序中描述的相同步骤进行操作。
-
在 Oscar 中,每个应用程序在“app.py”文件中都有自己的 URL,每个应用程序都带有一个具有“urls”属性的应用程序实例,用于访问应用程序的 URL 列表。
-
要将购物篮应用的 URL 从“basket”更改为“cart”,您需要通过创建其子类并覆盖“get_urls”方法来自定义根应用实例。
你的项目/app.py
来自 oscar 导入应用程序
类商店(app.Shop):
def get_urls(self):
网址模式 = [
网址(r'^cart/',包括(self.basket_app.urls)),
# ...
# 在此处重复 url
]
返回 url 模式
应用程序 = 商店()
自定义或向应用添加视图的步骤:
按照上述自定义应用程序中所述的相同步骤进行操作。
在views.py文件中新建一个视图类或创建Oscar的视图子类:
例如:向主页添加额外的上下文。
from oscar.apps.promotions.views import HomeView as CoreHomeView
class HomeView(CoreHomeView):
def get_context_data(self, **kwargs):
context = super(HomeView, self).get_context_data(**kwargs)
context["latest_products"] = Product.objects.filter(
parent=None).order_by('-date_created')
return context
请记住,您不需要在视图中从 django oscar 应用程序中导入 all(*)。
我从 MicroPyramid 博客获得的帮助。