
后端电商【免费下载链接】django-oscarDomain-driven e-commerce for Django项目地址https://gitcode.com/gh_mirrors/dj/django-oscar点击查看免费下载导读Django Oscar 是一套基于领域驱动设计DDD思想构建的 Django 电商框架开箱即用地提供了 catalogue目录、basket购物车、checkout结算、dashboard后台管理、offer优惠、wishlists愿望清单、reviews商品评价等完整模块。然而在实际项目中你往往并不需要全部功能——例如想用自己的后台替代 Oscar 自带的 dashboard或者想在不删除代码的前提下临时下线商品评价功能。本文基于官方 How-to 文档docs/source/howto/how_to_disable_an_app_or_feature.rst系统讲解两种裁剪方案一是通过自定义Shop根应用配置精确移除某个 App 的 URL二是通过OSCAR_HIDDEN_FEATURES设置与{% iffeature %}模板标签声明式隐藏某个特性。读完本文你将掌握如何在保留 Oscar 框架完整代码的前提下按需关闭后台、评价、愿望清单等功能并能够为自己的业务模块接入可隐藏机制。为什么需要禁用而非删除Oscar 的设计哲学之一是可定制优先框架源码保持完整项目通过继承、fork 和配置来改变行为。直接删代码会导致升级框架版本时难以合并而禁用是一种低侵入方案URL 级禁用从 URLconf 中剔除某个 App 的路由用户将无法访问该功能的所有页面特性级禁用通过设置项与模板标签组合同时隐藏 URL 和页面上的入口、按钮、评分区块等 UI 元素。两种方案都无需改动oscar包内部代码完全在项目自己的应用层完成这也是 Oscar 自定义体系docs/source/topics/customisation.rst所推崇的做法。方案一禁用某个 App 的 URL适用场景不使用 Oscar 的 dashboard、search、wishlists 等模块希望直接移除其所有路由。第一步根 urls.py 改为引用自己的 AppConfigOscar 根路由默认由oscar.config.Shop提供见 src/oscar/config.py它把 catalogue、basket、checkout、customer、search、dashboard、offer、wishlists 等子应用的 URL 统一挂载到各前缀下。要获得对 URL 结构的完全控制你需要把根urls.py从引用oscar.urls改为引用你自己项目的 AppConfig# urls.py from django.apps import apps urlpatterns [ # ... path(, include(apps.get_app_config(myproject).urls[0])), ]其中myproject是一个 Django/Oscar 应用它的 AppConfig 类是oscar.config.Shop的子类并在其中排除了 dashboard 应用的 URL 配置。这里的关键在于apps.get_app_config(myproject).urls在 src/oscar/core/application.py 中OscarConfigMixin.urls是一个返回(urlpatterns, label, namespace)三元组的属性所以include()只取下标[0]即 URL 列表。第二步自定义 Shop 子类并重写 get_urls在myproject/config.py中定义一个Shop子类重写get_urls()遍历父类生成的 URL 列表并移除名为dashboard的 URLPattern# myproject/config.py from oscar.config import Shop from oscar.core.application import OscarConfig class MyShop(Shop): # Override the get_urls method to remove the URL configuration for the # dashboard app def get_urls(self): urls super().get_urls() for urlpattern in urls[:]: if hasattr(urlpattern, app_name) and (urlpattern.app_name dashboard): urls.remove(urlpattern) return self.post_process_urls(urls)然后在myproject/__init__.py中声明默认的 AppConfig# myproject/__init__.py default_app_config myproject.config.MyShop原理剖析为什么这样能生效Shop.get_urls()src/oscar/config.py返回的列表中path(dashboard/, self.dashboard_app.urls)这一项是一个带app_name dashboard的 URLPattern因此能被精确匹配并移除循环中使用urls[:]创建副本遍历避免在迭代过程中修改列表导致跳过元素或抛异常self.post_process_urls(urls)src/oscar/core/application.py会递归处理所有 URLPattern并应用各视图的权限装饰器permissions_map/default_permissions确保移除 dashboard 后其余路由仍保持 Oscar 原有的权限保护逻辑。注意Shop在ready()中会通过apps.get_app_config(dashboard)加载各子应用src/oscar/config.py因此即使 dashboard 路由被移除其 AppConfig 仍存在于INSTALLED_APPS中不会引发导入错误——你只是关闭了它的对外 URL。第三步清理模板引用移除 URL 后还有一件收尾工作确保你的模板不再引用任何 dashboard 的 URL。Oscar 自带模板src/oscar/templates/oscar/中dashboard 相关的反向解析如{% url dashboard:index %}如果被渲染到页面上会因 URL 不存在而抛NoReverseMatch。若你 fork 了模板并保留了相关链接需要一并删除或改为条件渲染。方案二通过 OSCAR_HIDDEN_FEATURES 隐藏特性与整体移除 URL相比Oscar 还提供了一种更细粒度、声明式的特性隐藏机制它同时作用于路由层与模板层。设置项与默认值在项目的settings.py中把要隐藏的特性名加入OSCAR_HIDDEN_FEATURES列表即可OSCAR_HIDDEN_FEATURES [reviews, wishlists]该设置默认为空列表见 src/oscar/defaults.py# Hidden Oscar features, e.g. wishlists or reviews OSCAR_HIDDEN_FEATURES []从源码结构看当前版本内置声明了可隐藏特性的 App 是 reviews商品评价CatalogueReviewsConfig在 src/oscar/apps/catalogue/reviews/apps.py 中设置了hidable_feature_name reviews。官方文档同时将 wishlists 列为受支持特性测试套件也分别用OSCAR_HIDDEN_FEATURES[reviews]和[wishlists]验证了两者的隐藏行为见 tests/integration/test_hidden_features.py。模板层的隐藏{% iffeature %} 标签在模板中用{% iffeature %}/{% endiffeature %}包裹的代码块在对应特性被隐藏时不会渲染{% iffeature reviews %} {% include catalogue/reviews/partials/review_stars.html %} {% endiffeature %}该标签的实现位于 src/oscar/templatetags/display_tags.pyiffeature是一个 block tag解析{% iffeature reviews %}与{% endiffeature %}之间的nodelist并强制要求参数用引号包裹否则抛出TemplateSyntaxErrorConditionalOutputNode.render()调用feature_hidden(feature_name)判断若特性被隐藏则返回空字符串否则正常渲染nodelist。Oscar 自带模板已经大量使用了该标签例如商品详情页 src/oscar/templates/oscar/catalogue/detail.html 用{% iffeature reviews %}控制评价区域加入购物车表单 src/oscar/templates/oscar/catalogue/partials/add_to_basket_form.html 用其控制加入愿望清单按钮。因此只要设置OSCAR_HIDDEN_FEATURES这些 UI 入口会自动消失无需逐个修改模板。路由层的隐藏post_process_urls 自动拦截隐藏特性不仅在模板层生效还会自动移除对应 App 的 URL。其底层机制是 src/oscar/core/application.py 中post_process_urls()开头的判断# Test if this the URLs in the Application instance should be # available. If the feature is hidden then we dont include the URLs. if feature_hidden(self.hidable_feature_name): return []而feature_hidden()定义在 src/oscar/core/loading.pydef feature_hidden(feature_name): Test if a certain Oscar feature is disabled. return feature_name is not None and feature_name in settings.OSCAR_HIDDEN_FEATURES当某 AppConfig 的hidable_feature_name非空且命中OSCAR_HIDDEN_FEATURES时get_urls()最终返回空列表各 App 的get_urls()都以self.post_process_urls(urls)收尾例如 src/oscar/apps/catalogue/reviews/apps.py 与 src/oscar/apps/wishlists/apps.py该特性的所有路由便从 URLconf 中消失。方案三让你的自定义模块支持隐藏hidable_feature_name是OscarConfigMixin提供的通用机制见 src/oscar/core/application.py因此你可以为自己的业务 App 接入同样的隐藏能力。1. 在 AppConfig 中声明特性名假设你有一个lottery抽奖模块其 AppConfig 继承OscarConfig并设置特性名# myproject/apps/lottery/apps.py from oscar.core.application import OscarConfig class LotterConfig(OscarConfig): hidable_feature_name lottery2. 加入隐藏列表在settings.py中OSCAR_HIDDEN_FEATURES [lottery]3. 用模板标签包裹相关 UI{% iffeature lottery %} ... 抽奖入口、横幅、组件 ... {% endiffeature %}这样配置后lottery的 URL 会自动从 URLconf 中移除模板中包裹的区块也不会渲染整套逻辑与内置的 reviews 特性完全一致。值得注意的细节特性名是字符串匹配feature_hidden做的是feature_name in settings.OSCAR_HIDDEN_FEATURES的成员判断因此hidable_feature_name必须与列表中的字符串完全一致区分大小写hidable_feature_name默认为None此时feature_hidden恒为False即未声明特性名的 App 永远不会被该机制隐藏隐藏仅影响路由注册与模板渲染不影响模型、迁移与后台任务例如隐藏 reviews 后数据库中已存在的评价数据仍然保留相关 management command 也照常可用。测试验证隐藏行为如何被保障仓库为隐藏机制提供了专门的集成测试 tests/integration/test_hidden_features.py可以当作行为规范来理解test_reviews_enabled默认配置下商品详情页包含 Number of reviews评价计数区块test_reviews_disabled在OSCAR_HIDDEN_FEATURES[reviews]下访问同一页面断言不包含该区块test_wishlists_enabled账户页包含愿望清单 URL商品详情页包含 Add to wish list 按钮test_wishlists_disabled隐藏后账户页不再包含customer:wishlists-list的 URL商品页也不再出现 Add to wish list。这些用例通过self.settings(OSCAR_HIDDEN_FEATURES[...])上下文管理器动态切换设置直观印证了设置即生效的声明式设计——模板层与路由层的行为都可以被测试覆盖你在为自定义模块接入hidable_feature_name后完全可以参照该文件编写同样的测试。两种方案对比与选型建议维度方案一自定义 Shop.get_urls方案二OSCAR_HIDDEN_FEATURES控制粒度以整个 App 为单位移除 URL以特性名feature name为单位同时控制 URL 与模板配置位置项目根 AppConfigmyproject/config.pysettings.py中的OSCAR_HIDDEN_FEATURES对模板的影响需手动清理所有相关 URL 引用自动配合{% iffeature %}隐藏 UI 区块是否需写代码需重写get_urls()无需纯配置自定义特性时需设置hidable_feature_name典型场景替换整个 dashboard、关闭整个搜索模块临时下线评价、愿望清单等局部特性或为业务模块接入开关两条路径可以组合使用例如用方案一整体移除 dashboard 路由同时用方案二声明式地隐藏 reviews 与 wishlists从而把商城前台裁剪成仅浏览 下单的精简形态。无论选择哪种方式其共同原则都是保留框架代码完整性把要不要展示的决策留在项目配置层这正是 Oscar 可定制架构docs/source/topics/customisation.rst的核心价值所在。赞分享后端电商【免费下载链接】django-oscarDomain-driven e-commerce for Django项目地址https://gitcode.com/gh_mirrors/dj/django-oscar点击查看免费下载相关推荐如何在普通电脑上运行MiniCPM5-1B-GGUF打造你的专属本地AI助手如何在普通电脑上运行MiniCPM5 1B GGUF打造你的专属本地AI助手 你是否厌倦了依赖云端的AI服务担心隐私泄露想要一个完全掌控在自己手中的智能助人工智能大模型基础模型本地部署DeePMD-kit多后端支持深度解析TensorFlow、PyTorch、JAX全面对比DeePMD kit多后端支持深度解析TensorFlow、PyTorch、JAX全面对比 DeePMD kit作为一款先进的深度学习分子动力学模拟工具通过人工智能深度学习预训练微调模型推理科研科学计算AI 技能PictureSelector Library图片裁剪功能详解比例调整与自定义裁剪框PictureSelector Library图片裁剪功能详解比例调整与自定义裁剪框 在Android应用开发中图片裁剪功能是用户交互的重要组成部分。Pic移动开发UI组件音视频上一篇OWASP MASTG 安全测试持续改进软件价格软件授权费用下一篇SierraDeathGenerator项目深度解析如何生成300款游戏的死亡画面创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考