python random.random() 在自定义模板标签中导致“'module' object is not callable”错误

8 投票
3 回答
17712 浏览
提问于 2025-04-15 11:27

如果我从命令行启动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 文件删掉了,问题就解决了。

撰写回答