Для получения текущего времени с временной зоной (локализованное время) нужно использовать
now() не из datetime, а из django.utils.timezone:
from django.utils.timezone import now
Чтобы преобразовать
уже локализованный datetime в другую временную зону (например во временную зону пользователя):
from django.utils.timezone import now, pytz
user_timezone = pytz.timezone(user.timezone or settings.TIME_ZONE)
now().astimezone(user_timezone)
Если у вас
нелокализованный datetime и вы хотите добавить ему информацию о временной зоне:
from datetime import datetime
from django.utils.timezone import pytz
user_timezone = pytz.timezone(user.timezone or settings.TIME_ZONE)
user_timezone.localize(now())
Для того, чтобы Djagno использовало временные зоны для полей Date/Datetime нужно, они должны быть включены в настройках:
TIME_ZONE = 'Europe/Moscow'
USE_TZ = True