Django应用程序覆盖&导入路径?

时间:2013-12-10 11:43:29

标签: python django satchmo

让我们使用第三方应用程序进行django项目。 我想在不触及原始文件的情况下覆盖它的一些模块。 这里不可能进行简单的子类化,需要透明地覆盖代码,因为许多其他应用依赖于原始类名和函数。

项目的结构如下:

django_project/
  __init__.py
  settings.py
  overrides/        <-- here is a subdir with apps overrides
    __init__.py
    payment/        <-- here is an example of app to override
      __init__.py
      admin.py
      forms.py      <-- this file is ignored, original is imported
      models.py
      tests.py
      views.py

settings.py已使用

进行了修改
INSTALLED_APPS=(
    'satchmo_store.shop'
    #'payment'           # original values
    'overrides.payment'  # modified app
    ...
)

上述解决方案不起作用,因为Django没有将添加的应用程序的路径插入模块搜索路径(sys.path)。 Django只会加载admin.pymodels.pytests.pyviews.py,其他文件如forms.py会被忽略。

此行为是否记录在某处?将模块名称放在INSTALLED_APPS中的确切位置是什么?

我用manage.py中的新模块搜索路径和Apache的WSGIPythonPath设置硬编码来破解这种情况。

import os.path
import sys

DIRNAME       = os.path.dirname(__file__)
APPS_OVERRIDE = os.path.join(DIRNAME, 'overrides')

if not APPS_OVERRIDE in sys.path:
    sys.path.insert(1, APPS_OVERRIDE)

我怀疑这是正确的方法。找不到描述应用覆盖的指南。

那么,我怎样才能在我的项目中正确覆盖外部Django应用程序?

奖励问题:我是否需要复制整个应用程序目录树,而不仅仅是真正修改过的特定文件?据我所知,Python在第一次匹配模块路径时停止,因此它赢了不要导入搜索路径的以下部分中可用的其他模块。

2 个答案:

答案 0 :(得分:1)

如何覆盖表单的示例:

<强>重写/支付/ forms.py

from django import forms
class YourNewFormThingy(forms.Form): pass

<强>重写/支付/ models.py

from satchmo.payment import forms as satchmo_payment_forms
from . import forms

satchmo_payment_forms.SomeForm = forms.YourNewFormThingy

答案 1 :(得分:0)

尝试包括payment以及override.paymentsatchmo使用payment模块来处理付款,payment代码足够灵活,可以将您的代码包含在内好。