【问题标题】:How to override an app in Django properly?如何正确覆盖 Django 中的应用程序?
【发布时间】:2011-07-05 08:40:18
【问题描述】:

我正在运行 Satchmo。有很多应用程序,我已经更改了 Product 应用程序中的一些源。

所以我的问题是如何正确覆盖它,因为更改是特定于站点的。我是否必须复制整个 Satchmo 框架并将其放入我的项目中,或者我可以将其中一个应用程序复制出来并将其放置在 Satchmo>App>Products 中? (有点像模板)

谢谢

【问题讨论】:

    标签: python django satchmo


    【解决方案1】:

    我所做的工作是复制我已更改的应用程序。在这种情况下 satchmo\apps\product。 我将应用程序复制到我的项目文件夹中 将我的 setting.py INSTALLED_APPS'product', 修改为 'myproject.product',

    这现在只包含我对此项目所做的更改,原始产品应用程序保持不变,仍然可以从其他项目中正常读取。

    【讨论】:

      【解决方案2】:

      当您在 settings.py 文件中将“Django App”添加到 INSTALLED_APPS 时,您是在告诉 Django 在您的“python 路径”中存在一个具有该名称的可导入 python 模块。您可以通过查看存储在sys.path 的列表内容来查看您的python 路径。

      每当 Python(在本例中为 Django)尝试导入模块时,它会检查sys.path 中列出的每个目录按顺序,当它找到与给定名称匹配的模块时会停止。

      那么解决您的问题的方法是将您自定义的 Django 应用程序(例如 Satchmo product 模块)放入您的 Python 路径中的某个位置,该位置将在“真正的”Satchmo 之前进行检查 product 模块。

      因为我不知道您的目录结构是如何布置的,所以我基本上在这里进行猜测,但就您而言,听起来您的 Satchmo 应用程序位于 /satchmo/apps/ 之类的地方,而您的项目位于 @ 987654328@。在这种情况下,您可能希望将自定义的product 模块添加到/my_custom_path/my_project/product/。因为始终检查 Django settings.py 文件所在的路径首先,这意味着将首先找到并导入您自定义的 product 模块,而不是内置的 Satchmo 模块。 p>

      仅供参考:要检查并查看 Satchmo 安装检查模块目录的顺序,请运行 python manage.py shell,然后在提示符中执行 import sys; print sys.path

      【讨论】:

      • 嗨,克里斯。但是,如果我不希望我的其他应用程序使用此自定义产品应用程序怎么办?他们仍将首先导入此产品,因为它首先在路径上找到。我只想覆盖此网站的应用程序。
      • 也许如果您解释一下您的目录结构的布局,我将能够提供帮助。到目前为止,我还不清楚你的应用程序、库和项目是如何布局的。
      【解决方案3】:

      通常,我会说最好的办法是分叉 Satchmo 并保留一份包含更改的副本。

      如果您愿意使用 python 路径,请确保您的应用程序目录出现在其他(默认)目录之前。根据我的测试,如果您有两个名称相同的应用程序/模块,则使用找到的第一个。

      【讨论】:

      • 嘿嘿。这是一个特定于站点的更改,所以我真的不想分叉 satchmo 并将其放在路径上,因为我不希望任何其他项目使用它。
      • 那么第二个选项就成立了。您所要做的就是调整 python 路径(根据 Chris 的注释)并确保您的“产品”位于标准 satchmo 的产品(我假设它是通过 pip/easy_setup 安装的)之前。
      • 另外(我不能让它做段落),你可以用 virtualenv 隔离你的网站。然后,只有您的站点才能访问修改后的 satchmo 副本...
      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2012-09-15
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多