
这样做的原因是,尝试为电子商务开发一种通用的解决方案会导致代码过于复杂,而这通常远非最佳.
解决这个问题的一种方法似乎是通过Django的设置文件或导入黑客来使用控制反转,但是由于Django如何注册其模型,我遇到了一些问题.
电子商务框架提供了一堆抽象模型,以及{app_label} /models.py中的具体版本.视图利用Django的get_model(app_label,model)函数返回模型类,而无需对引用进行硬编码.
这种方法有一些问题:
>用户必须模仿框架应用程序的结构,即app_label,并有效地用自己的应用程序替换我们的应用程序版本
>由于管理站点的工作方式是在每个已安装的应用程序中查找admin.py,因此他们必须模仿或显式导入框架的管理类才能使用它们.但是通过导入它们,会调用register方法,因此如果用户想要自定义它们,则必须取消注册.
>用户必须非常小心他们如何从核心框架导入具体模型.这是因为一旦读取了类定义(即__new__),Django的基本模型元类会自动将应用程序缓存注册到模型中,并且使用特定标签注册的第一个模型就是您坚持使用的模型.因此,在导入任何核心模型之前,必须定义所有覆盖模型.这意味着您最终会遇到混乱的情况,即在模块的底部而不是顶部进行大量导入.
我的想法是进一步降低控制反转的兔子洞:
>所有对核心组件(模型,视图,管理员等)的引用都替换为对IoC容器的调用
>对于所有核心(电子商务框架)模型,将Django的基本模型元类的使用替换为不自动注册模型的模型,然后让容器在启动时显式注册它们.
我的问题:
有没有更好的方法来解决这个问题?目标是使自定义框架和覆盖功能变得容易,而不必学习很多烦人的技巧.关键似乎是模型和管理站点.
我很欣赏使用IoC容器不是Django世界中常见的模式,所以我想尽可能避免它,但它看起来像是正确的解决方案.
解决方法 您是否使用类似方法查看其他项目的代码?不确定这种方式是否满足您的需求,但是值得看一下 django-shop的代码.
该框架提供了基本逻辑,允许您在需要时提供自定义逻辑.
通过模型定制
例如,参见productmodel.py
#==============================================================================# Extensibility#==============================================================================PRODUCT_MODEL = getattr(settings,'SHOP_PRODUCT_MODEL','shop.models.defaults.product.Product')Product = load_class(PRODUCT_MODEL,'SHOP_PRODUCT_MODEL')
通过逻辑/网址进行自定义
例如,参见商店的simplevariation-plugin
它扩展了cart-logic,因此它通过urlpattern挂钩:
(r'^shop/cart/',include(simplevariations_urls)),(r'^shop/',include(shop_urls)),
并扩展了观点:
…
from shop.vIEws.cart import CartDetailsclass SimplevariationCartDetails(CartDetails): """Cart vIEw that answers GET and posts request."""...
该框架为钩子提供了几个点,上面提到的simplevariation-plugin还提供了一个cart-modifIEr:
SHOP_CART_MODIFIERS = [ ... 'shop_simplevariations.cart_modifIEr.ProductoptionsModifIEr',...]
我担心这种解释不是很容易理解,很难简要总结这个概念.但是看看django-shop项目及其一些扩展:ecosystem
总结以上是内存溢出为你收集整理的Django设计模式以覆盖模型全部内容,希望文章能够帮你解决Django设计模式以覆盖模型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)