让我们使用第三方应用程序进行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.py
,models.py
,tests.py
和views.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在第一次匹配模块路径时停止,因此它赢了不要导入搜索路径的以下部分中可用的其他模块。
答案 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.payment
,satchmo
使用payment
模块来处理付款,payment
代码足够灵活,可以将您的代码包含在内好。