2

我想覆盖 django-oscar 地址应用程序。我需要的是删除一些 AbstractAddress 属性(apps.address.abstact_models)。根据这个文档,过程如下 - 创建具有相同名称的本地应用程序并在模型模块中发挥我的作用。不要忘记在文件末尾从默认的 abstract_models 导入 *。然后将此应用程序添加到 installed_apps 中,最后添加 schemamigration --auto 并迁移。

但是 django 没有接受更改。此外,任何覆盖 AbstractAddress 类方法的尝试都会被忽略。为什么?abstract_models 有什么特别之处吗?

4

2 回答 2

0

原因通常是您的定制模型是在 Oscar 原始模型之后挑选(导入)的。确保该应用程序位于 Oscar 的应用程序之上。

如果没有,Django Oscar 文档中有一个很好的提示:http: //django-oscar.readthedocs.org/en/latest/topics/customisation.html

模型定制没有被拾取

您尝试自定义 Oscar 的模型之一是一个常见问题,但您的新领域似乎没有得到采纳。这通常是因为 Oscar 的模型在您的定制模型之前被导入。Django 的模型注册忽略了所有进一步的模型声明。

在您的覆盖模型.py 中,确保在定义自定义模型后导入 Oscar 模型。如果这没有帮助,您可以从 oscar.apps.*.models 某处导入,该导入在您的模型被解析之前正在执行。找到该导入的一个技巧:将 assert False 放入相关 Oscar 的 models.py 中,堆栈跟踪将向您显示导入模块。

如果其他模块需要导入您的模型,则从您的本地模块导入,而不是直接从 Oscar 导入。

于 2014-04-04T04:28:32.667 回答
0

抽象模型类并不意味着像其他模型一样被动态覆盖和拾取。但是,您可以创建自己的抽象类并创建一个继承自它的新地址模型(例如 ShippingAddress),而不是 oscar.xml 中包含的那个。

于 2014-04-19T05:27:59.677 回答