![](/img/trans.png)
[英]How do I get the visitor's current timezone then convert timezone.now() to string of the local time in Django 1.4?
[英]django 1.4 how to automatically get user's timezone from client
我想知道是否有辦法從客戶端自動檢索用戶的時區。 特別是在登錄期間。
我嘗試在登錄頁面中添加它(使用auth.login
):
{% get_current_timezone as TIME_ZONE %}
然后將其添加到登錄表單中
<input type="hidden" name="next" value="/redirect/?tz={{ TIME_ZONE }}">
但tz
始終是服務器的時區。
從文檔中 :
選擇當前時區
當前時區相當於當前翻譯的語言環境。 但是,沒有等效的Django可用於自動確定用戶時區的Accept-Language HTTP標頭。 相反,Django提供了時區選擇功能。 使用它們來構建對您有意義的時區選擇邏輯。
您可以嘗試使用getTimezoneOffset函數通過javascript設置時區cookie,或嘗試做一些geoip魔術並按位置計算時區。 可能最可靠的方法是直接詢問用戶並將此信息保存在用戶個人資料/會話中。
我進一步簡化了它,您可以在這里插入: https : //github.com/Miserlou/django-easy-timezones或http://gun.io/blog/django-easy-timezones/
昨天我在尋找山姆。 最后,我最終將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詞典中:
國家-訪問者所在的國家/地區。
城市-訪問者所在的城市
location.timezone-位置訪問者中使用的時區基於
location.unit_system-位置訪問者中使用的單位系統基於
user.timezone-當前經過身份驗證的用戶的時區
user.unit_system-當前已認證用戶的單位系統。
cookie_notice-如果應為當前訪問者顯示cookie同意通知,則為true。
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
之上編寫的個人實用程序類
我只是在我的程序中這樣做了。 在我的 js 中:
<script>
var today = new Date()
var offset = today.getTimezoneOffset()
const serializedData = 'csrfmiddlewaretoken={{ csrf_token }}&tz_offset= '
+ offset.toString()
</script>
然后在 django 端:
def your_function(request):
tz_offset = request.POST.get('tz_offset')
now = datetime.datetime.now() - timedelta(minutes=int(tz_offset))
return now
我將 serializedData 傳遞給 POST 請求,然后在我的 function 中訪問它
<script>
function update_transaction(serializedData){
$.post('{% url "your_url" %}', serializedData, function(data){
//do stuff
});
}
</script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.