我想知道是否有办法从客户端自动检索用户的时区。特别是在登录期间。
我尝试在登录页面中添加它(使用auth.login
):
{% get_current_timezone as TIME_ZONE %}
然后将其添加到登录表单中
<input type="hidden" name="next" value="/redirect/?tz={{ TIME_ZONE }}">
但tz
始终是服务器的时区。
我进一步简化了它,你可以在这里插入:https ://github.com/Miserlou/django-easy-timezones 或 http://gun.io/blog/django-easy-timezones/
从文档中:
选择当前时区
当前时区相当于翻译的当前语言环境。但是,Django 无法使用 Accept-Language HTTP 标头来自动确定用户的时区。相反,Django 提供了时区选择功能。使用它们来构建对您有意义的时区选择逻辑。
您可以尝试使用getTimezoneOffset函数通过 javascript 设置时区 cookie,或者尝试做一些 geoip 魔术并按位置计算时区。可能最可靠的方法是直接询问用户并将此信息保存在用户配置文件/会话中。
昨天我正在四处寻找相同的东西。最后,我最终根据 BluesRockAddict 的建议将 Django 应用程序放在一起(即使用 getTimezoneOffset):
https://github.com/adamcharnock/django-tz-detect
我希望有人觉得这很有用。
django 有一个不错的 APP 可以激活时区https://pypi.python.org/pypi/django-visitor-information-middleware/0.1.0。其中有两个中间件
时区中间件
中间件为经过身份验证的用户激活时区。
访客信息中间件
该中间件将以下键添加到 request.visitor 字典中:
country - 访问者所在的国家/地区。
city - 访问者所在的城市
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.
我目前创建了一个中间件类(遵循 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