8

コマンドラインからpythonを起動して次のように入力すると:

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

それは私に乱数を出力します(期待、優れています)。

上記の 2 行を django アプリケーションの models.py に含めて、django アプリを runserver で起動すると、コマンド ラインに出力が表示され、乱数が表示されます (すばらしい!)。

それ以外の場合は完全に正常に機能するカスタムタグを使用する場合、

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

カスタム タグの .py ファイルの最初の 2 行のように、そのカスタム タグを使用するテンプレートを開こうとするとエラーが発生します。

TypeError at /help/
'module' object is not callable

これらの 2 行を削除すると、カスタム タグは想定どおりに動作し、エラーはスローされないことに注意してください。残念ながら、テンプレート タグ内でランダムな動作が必要です。

問題は、カスタムタグで次のことを行う場合です。

import random

カスタム テンプレート タグでは、インポートします

<module 'django.templatetags.random' from '[snip path]'> 

ではない

<module 'random' from 'C:\\Program Files\\Python26\\lib\\random.pyc'>

通常、他の場所からインポートされるように

Django テンプレート ライブラリには random と呼ばれるフィルターがあり、どういうわけかシステムの random よりも優先されています。

適切なpythonランダムを明示的にインポートする方法を誰かが推奨できますか?

4

3 に答える 3

18

答えは...奇妙です。

私が最初にカスタムタグを書いたとき、私はそれを呼びましたrandom.py。私はすぐにこの名前が良くないかもしれないことに気づき、名前を変更してファイルrandomchoice.pyを削除しました。random.pyPythonはコンパイルされたrandom.pycファイルを保持し、私が実行するたびにロードされていましたimport random。random.pycファイルを削除すると、問題は解決しました。

于 2009-05-08T03:39:10.027 に答える
5

はい、この種のエラーは非常に簡単です。基本的に、使用する可能性のある python モジュールと同じ名前でファイル名や作成したものに名前を付けないでください。

于 2010-02-21T19:39:35.120 に答える
2

Django をいじってからしばらく経ちましたが、random.random が「モジュール」である場合は、random.random.random() を試してください。または、random() を試してみてください。舞台裏でどんな種類のハッキングが行われているのかわからないだけです。

編集

これを試して:

sys.path = [r"C:\Program Files\Python26\lib\"] + sys.path
import random
sys.path.pop(0)
于 2009-05-08T02:28:47.607 に答える