我想知道是否有办法从客户端自动检索用户的时区。特别是在登录期间。
我尝试在登录页面中添加此内容(使用auth.login
):
{% get_current_timezone as TIME_ZONE %}
然后在登录表单中添加
<input type="hidden" name="next" value="/redirect/?tz={{ TIME_ZONE }}">
但tz
始终是服务器的时区。
答案 0 :(得分:13)
我进一步简化了,你可以在这里插入:https://github.com/Miserlou/django-easy-timezones 要么 http://gun.io/blog/django-easy-timezones/
答案 1 :(得分:11)
选择当前时区
当前时区是 相当于当前翻译的区域设置。但是,没有 相当于Django可以使用的Accept-Language HTTP标头 自动确定用户的时区。相反,Django提供 时区选择功能。使用它们来构建时区 选择逻辑对你有意义。
您可以尝试使用getTimezoneOffset功能通过javascript设置时区Cookie,或者尝试按位置执行一些geoip魔术并计算时区。可能最可靠的方法是直接询问用户并将此信息保存在用户配置文件/会话中。
答案 2 :(得分:8)
昨天我正在寻找山姆的东西。最后,我最终将Django应用程序整合到BluesRockAddict上面建议的内容中(即使用getTimezoneOffset):
https://github.com/adamcharnock/django-tz-detect
我希望有人觉得有用。
答案 3 :(得分:2)
django有一个很好的APP来激活时区https://pypi.python.org/pypi/django-visitor-information-middleware/0.1.0。哪个有两个中间件
<强> TimezoneMiddleware 强>
中间件为经过身份验证的用户激活时区。
<强> VisitorInformationMiddleware 强>
此中间件将以下密钥添加到request.visitor字典:
国家/地区 - 访问者所在的国家/地区。
城市 - 访客所在的城市
location.timezone - 位置访问者使用的时区位于
location.unit_system - 位置访问者使用的单位系统基于
user.timezone - 当前经过身份验证的用户的时区
user.unit_system - 当前经过身份验证的用户的单位系统。
cookie_notice - 如果应为当前访问者显示cookie同意通知,则为真。
Note: Location of the user is determined based on the user's IP address.
答案 4 :(得分:0)
我目前创建了一个中间件类(遵循Django的文档),我依赖MaxMind geoip数据库(http://dev.maxmind.com/geoip/legacy/geolite)和GeoDjango(https://docs.djangoproject.com/en/1.5/ref/contrib/gis/)来检索用户的国家/地区代码,然后动态设置时区pytz:
class TimezoneMiddleware(object):
def __getUserTimeZone(self, request):
info = IPResolver(request).getGeoInfo()
return pytz.country_timezones[info['country_code']][0]
def process_request(self, request):
try:
tz = self.__getUserTimeZone(request)
timezone.activate(tz)
logger.debug('Time zone "%s" activated' % str(tz))
except Exception as e:
logger.error('Unable to set timezone: %s' % str(e))
pytz.country_timezones
会返回给定国家/地区可用的时区集合,因此我基本上会选择返回的第一个时区。
IPResolver
是我在django.contrib.gis.utils.GeoIP