如何正确地重写 Django 中的应用?
我正在使用Satchmo这个框架。里面有很多应用程序,我对产品应用程序的一些源代码进行了修改。
所以我想问的是,怎样才能正确地覆盖这些修改,因为这些改动是针对我这个网站特定的。我是不是需要把整个Satchmo框架都复制一遍,放到我的项目里,还是说我只需要把其中一个应用程序复制出来,放到比如说Satchmo>App>Products里就可以了?(有点像处理模板那样)
谢谢
3 个回答
通常,我会建议你把Satchmo复制一份,然后在自己的版本上进行修改。
如果你愿意调整一下python的路径,确保你的应用程序目录在其他(默认)目录之前。根据我的测试,如果有两个应用或模块名字一样,系统会优先使用第一个找到的那个。
当你在 settings.py
文件的 INSTALLED_APPS
中添加一个“Django应用”,其实是在告诉Django,你的“python路径”中有一个可以导入的Python模块,名字就是你添加的那个。你可以通过查看 sys.path
中的内容来查看你的python路径。
每当Python(在这里是Django)尝试导入一个模块时,它会按照 sys.path
中列出的目录顺序一个一个地检查。当找到一个名字匹配的模块时,它就会停止查找。
所以,解决你问题的方法就是把你自定义的Django应用,比如Satchmo的 product
模块,放到一个在你的python路径中会被检查到的地方,而且这个地方要在“真正的” Satchmo product
模块之前。
因为我不知道你的目录结构是怎样的,所以我只能猜测,但听起来你的Satchmo应用可能在 /satchmo/apps/
这个位置,而你的项目在 /my_custom_path/my_project/
。在这种情况下,你可能想把你自定义的 product
模块放到 /my_custom_path/my_project/product/
。因为你的Django settings.py
文件所在的路径总是会被最先检查,这样就意味着你的自定义 product
模块会被优先找到并导入,而不是内置的Satchmo模块。
顺便说一下:要查看你的Satchmo安装在检查模块时的目录顺序,可以运行 python manage.py shell
,然后在提示符下输入 import sys; print sys.path
。
我做的一个有效的方法是复制我修改过的应用程序。在这个例子中是 satchmo\apps\product。
我把这个应用程序复制到了我的项目文件夹里。
然后我修改了我的 setting.py 文件中的 INSTALLED_APPS
,把 'product',
改成了 'myproject.product',
这样一来,这个应用程序就只包含我为这个项目所做的修改,而原来的产品应用程序则保持不变,仍然可以在其他项目中正常使用。