python random.random()导致在自定义模板标记中使用“'模块'对象不可调用”

时间:2009-05-08 01:55:27

标签: python django random templatetags

如果我从命令行启动python并输入:

import random
print "Random: " + str(random.random())

它打印一个随机数(预期,优秀)。

如果我在我的django应用程序的models.py中包含上面两行,并使用runserver启动我的django应用程序,我会在命令行上显示输出,显示一个随机数字(太棒了!)

如果我采用自定义标签,其他方式完全正常,但我包括

import random
print "Random: " + str(random.random())

作为自定义标记的.py文件的前两行,每当我尝试打开使用该自定义标记的模板时,我都会收到错误:

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的过滤器,不知怎样它的优先级高于系统的随机值。

有人可以推荐如何显式导入适当的python随机?

3 个答案:

答案 0 :(得分:14)

答案是......很奇怪。

当我最初编写自定义标记时,我将其称为random.py。我很快意识到这个名称可能不太好,并将其重命名为randomchoice.py并删除了我的random.py文件。 Python保留了编译好的random.pyc文件,每当我import random时它就会被加载。我删除了random.pyc文件,问题就消失了。

答案 1 :(得分:5)

是的,这种错误非常简单。基本上不要将您创建的任何文件名或任何名称命名为与将要使用的任何可能的python模块相同的名称。

答案 2 :(得分:2)

自从我使用Django后,已经有一段时间了,但如果random.random是一个“模块”,那么尝试random.random.random()。或者也许只是尝试随机()。你只是不知道幕后会发生什么样的hackery。

修改

试试这个:

sys.path = [r"C:\Program Files\Python26\lib\"] + sys.path
import random
sys.path.pop(0)