python random.random() приводит к тому, что "модуль-объект не вызывается" при использовании в пользовательском теге шаблона
Если я запускаю python из командной строки и набираю:
import random
print "Random: " + str(random.random())
Он печатает мне случайное число (ожидаемое, отлично).
Если я включу две вышеупомянутые строки в файл models.py моего приложения django и запусту приложение django с помощью runserver, я получу вывод в командной строке, показывающий мне случайное число (Отлично!)
Если я возьму пользовательский тег, который отлично работает в противном случае, но я включаю
import random
print "Random: " + str(random.random())
как первые 2 строки.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 имеет фильтр, называемый случайным, и каким-то образом он получает приоритет над системным.
Кто-нибудь может порекомендовать, как явно импортировать правильный случайный питон?
3 ответа
Ответ... странный.
Когда я первоначально написал свой собственный тег, я назвал его random.py
, Я быстро понял, что это имя не может быть хорошим и переименовал его randomchoice.py
и удалил мой random.py
файл. Python сохранил скомпилированный random.pyc
файл вокруг, и он загружался всякий раз, когда я сделал import random
, Я удалил свой файл random.pyc, и проблема исчезла.
Да, такая ошибка довольно проста. По сути, не называйте ни одно из ваших имен файлов или что-либо, что вы создаете с теми же именами, что и любые вероятные модули Python, которые вы собираетесь использовать.
Прошло много времени с тех пор, как я возился с Django, но если random.random является "модулем", то попробуйте random.random.random(). Или просто попробуйте random (). Вы просто не знаете, что за хакерство происходит за кулисами.
редактировать
Попробуй это:
sys.path = [r"C:\Program Files\Python26\lib\"] + sys.path
import random
sys.path.pop(0)