python random.random() 在自定义模板标签中导致“'module' object is not callable”错误
如果我从命令行启动Python,然后输入:
import random
print "Random: " + str(random.random())
它会给我打印一个随机数(这很正常,太棒了)。
如果我把上面这两行代码放到我的Django应用的models.py文件里,然后用runserver启动我的Django应用,我在命令行上也能看到一个随机数的输出(太好了!)
但是,如果我在一个自定义标签的.py文件开头加上:
import random
print "Random: " + str(random.random())
每当我尝试打开一个使用这个自定义标签的模板时,就会出现错误:
TypeError at /help/
'module' object is not callable
请记住,如果我去掉这两行代码,我的自定义标签就能正常工作,也不会出现错误。不幸的是,我需要在我的模板标签里有一些随机的行为。
问题是,如果在自定义标签里我这样做:
import random
在一个自定义模板标签中,它导入了
<module 'django.templatetags.random' from '[snip path]'>
而不是
<module 'random' from 'C:\\Program Files\\Python26\\lib\\random.pyc'>
通常从其他地方导入的内容。
Django的模板库有一个叫做random的过滤器,而这个过滤器似乎优先级高于系统的random。
有没有人能推荐一下如何明确导入正确的Python random?
3 个回答
2
我已经有一段时间没玩Django了,但如果说random.random是一个“模块”,那么你可以试试random.random.random()。或者直接试试random()。你根本不知道背后发生了什么样的黑科技。
编辑
试试这个:
sys.path = [r"C:\Program Files\Python26\lib\"] + sys.path
import random
sys.path.pop(0)
5
是的,这种错误其实很简单。基本上,你创建的文件名或者其他任何东西,都不要和你可能会用到的Python模块同名。
18
这个答案有点奇怪。
我最开始写自定义标签的时候,叫它 random.py
。后来我意识到这个名字可能不太好,就把它改成了 randomchoice.py
,并删除了我的 random.py
文件。可是,Python 还保留着编译后的 random.pyc
文件,每次我执行 import random
时,它都会被加载。最后我把 random.pyc
文件删掉了,问题就解决了。