пятница, 4 мая 2012 г.

pytils distance_of_time в Django 1.4 (Timezones)

Столкнулся недавно с тем, что фильтр distance_of_time библиотеки pytils отказался работать в проекте на Django 1.4, выдавая следующую ошибку:
CAN'T SUBTRACT OFFSET-NAIVE AND OFFSET-AWARE DATETIMES
Собственно из текста ошибки понятно, что нельзя вычитать (да и складывать тоже) даты различных типов. Далее логично предположить (особенно если вы читали документацию по свежевышедшему django 1.4.), что дело здесь в поддержке таймзон, которая появилась в django 1.4

Если заглянем в исходник pytils, то увидим, что шаблонный фильтр distance_of_time использует функцию distance_of_time_in_words() из pytils/dt.py

И проблема кроется в самом начале:

to_time = datetime.datetime.now()

Тут должна получатся дата правильного типа. Смотрим в документацию по таймзонам, и узнаем, что в  django.utils.timezone есть функция now() которая:
…returns the current date and time as a naive datetime when USE_TZ = False and as an aware datetime when USE_TZ = True.
Исходя из этого, для себя я сделал так:


from django.utils import timezone

…

to_time = timezone.now()

Вот и все. Минус такого решения я вижу следующий: pytils питонячая библиотека а не только для django а сделав так, как описано выше, без джанги ничего работать уже не будет. Вернее distance_of_time работать не будет.

Комментариев нет:

Отправить комментарий