我正在使用 Django 1.2 pre-alpha 和 Python 2.4。是的,我知道,但我坚持下去。我们目前无法升级,我怀疑这就是答案。
我有两个模板标签库,foo 和bar。不过foo也是一个顶层包的名字,正好是bar的包:
foo-1.2.3/
foo/
conf/
settings.py
templatetags/
bar.py
bar-4.5/
somepackage/
templatetags/
foo.py
标签库 bar.py 包含这样一行:
from foo.conf import settings
...您会期望它加载 foo-1.2.3/foo/conf/settings.py。
但是没有:
TemplateSyntaxError: 'bar' is not a valid tag library: Could not load template library from django.templatetags.bar, No module named conf
不幸的是,Django 执行a little magic并将所有模板标签库绑定(bind)到 django.templatetags.*。因此,bar 被导入为 django.templatetags.bar,当它调用 from foo.conf import settings 时,它最终导入 bar-4.5/somepackage/templatetags/foo.py。啊!
您有解决此问题的任何想法吗?
我在导入之前设置了一个断点,并且我已经确认 foo-1.2.3 位于 sys.path 的开头,但是import 关键字仍然找到错误的 foo。
如果有帮助,请注意,我可以修改foo-1.2.3包(因为它已在本地 checkin 并正在逐步淘汰),但我拒绝修改bar -4.5 包(因为它是一个开源包并且已经在系统范围内安装)。
请您参考如下方法:
经过几个小时的黑客攻击,这成功了。
原代码:
from foo.conf import settings
新代码:
foo = __import__('foo')
conf = __import__('foo.conf').conf
settings = __import__('foo.conf.settings').conf.settings
(我可能不需要第二行。)
哇哦。
