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)
Другие вопросы по тегам