如何正确地重写 Django 中的应用?

6 投票
3 回答
2347 浏览
提问于 2025-04-16 12:38

我正在使用Satchmo这个框架。里面有很多应用程序,我对产品应用程序的一些源代码进行了修改。

所以我想问的是,怎样才能正确地覆盖这些修改,因为这些改动是针对我这个网站特定的。我是不是需要把整个Satchmo框架都复制一遍,放到我的项目里,还是说我只需要把其中一个应用程序复制出来,放到比如说Satchmo>App>Products里就可以了?(有点像处理模板那样)

谢谢

3 个回答

2

通常,我会建议你把Satchmo复制一份,然后在自己的版本上进行修改。

如果你愿意调整一下python的路径,确保你的应用程序目录在其他(默认)目录之前。根据我的测试,如果有两个应用或模块名字一样,系统会优先使用第一个找到的那个。

4

当你在 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

5

我做的一个有效的方法是复制我修改过的应用程序。在这个例子中是 satchmo\apps\product
我把这个应用程序复制到了我的项目文件夹里。
然后我修改了我的 setting.py 文件中的 INSTALLED_APPS,把 'product', 改成了 'myproject.product',

这样一来,这个应用程序就只包含我为这个项目所做的修改,而原来的产品应用程序则保持不变,仍然可以在其他项目中正常使用。

撰写回答