home
join about login
Django tips and tricks

gst

Feb. 23, 2018, 2:34 a.m.

How to make django timezone aware

As far as I know there is no way for the browser to tell the application what is the user's timezone.
That is a problem when you want to run an international site, mostly when users from different places save time related stuff.
Some people suggest to just ask the user what his timezone is.
I did not want to bother them with that, so I created this little hack.
this involves a context processor and some javascript.

So lets start with the context processor in django.
you start by writing your context_processor.py file

 from django.utils import timezone
def timezone_processor(request):
# look for a cookie that we expect to have the timezone
tz = request.COOKIES.get('local_timezone', None)
if tz:
tz_int = int(tz) # cast to int
# here we decide what will prefix timezone number
# the output of tz_str will be something like:
# Etc/GMT+1, GMT+0, Etc/GMT-2
if tz_int >= 0:
tz_str = 'Etc/GMT+'+tz
else:
tz_str = 'Etc/GMT'+tz
# this forces timezone
timezone.activate(tz_str)
# Now we tell the template that we have a timezone
return {'local_timezone': tz}

For the context processor to work you must declare it in settings.py
 TEMPLATES = [
{
.........
'OPTIONS': {
'context_processors': [
.........
'myapp.context_processors.timezone_processor',
],
},

Ok, so this code just create a timezone string and activates it.
A template context processor returns a dictionary that will be sent to the context of the template when rendering. Here we are returning local_timezone.
But where this cookie come from? Lets go to the template and make this javascript trick.

 <!-- if django already knows timezone we will not run it again -->
{% if not local_timezone %}
<!-- getTimezoneOffset does the trick! -->
<!-- it return minutes so we divide to get hours -->
timezone = new Date().getTimezoneOffset() / 60;
document.cookie = 'local_timezone=" + timezone;
<!-- set a cookie with this value and we are done -->
{% endif %}
*for simplicity I didn't include cookie expires nor half hour timezones like North Korea.

So it's first time the user enters the site. Django doesn't know yet it's timezone.
As local_timezone comes empty, we run this javascript lines, get the timezone offset and save it in a cookie.

Next page the user enters, the context processor will read that cookie and will activate the appropriate timezone.
If you need to activate it the very first time, just make it refresh after setting the cookie.

Well that's it, hope this helps you.

840 views origin
Guri de Uruguaiana fala sobre hits do Carnaval e exageros no Phot - Austria plans tougher sentences for crimes against women - NASA Awards Contract for Continued Operations of its Jet Propulsi - Launching to Observe Our Sun - Eclipse solar hoje! - Eu vi eu viiiii O papai noel tava na sinaleira - GLORIA GROOVE - SEDANAPO - Noel Guarany | Sem Fronteira (1975) [Álbum Completo/Full Album] - Fallece un exdiputado federal del PRI tiroteado este fin de seman - Southern California as Seen From Apollo 7 - Tonella - revisão do limpador de parabrisa do fusca - Celebrating 28 Years of the Hubble Space Telescope - At Tranquility Base - Little Planet Soyuz - Orion in Red and Blue - gliptodonte encontrado en Picada Varela - casados - Climate change: 'Hothouse Earth' risks even if CO2 emissions slas - Trump quip about North Korea's Kim sparks outcry on social media - Federer pummels Bemelmans to move closer to top spot - Major League Baseball notebook: Mariners deal for Colome, Span fr - Los candidatos se disputan el poderoso voto del magisterio mexica - Pipi das Meias Altas Portuguese vol 1 - This is how to train a cat :D How I Trained My Cat - Cetus Galaxies and Supernova - The Extraordinary Spiral in LL Pegasi - Slava Ukraini! on Steam - NASA Awards Contract for Aerospace Systems Modeling, Simulation - Exclusive: North Korea earned $200 million from banned exports, s - amizades - Wozniacki passes Barty test in Madrid, Sharapova advances - Dieguito - A Lesma © ℗ MÚSICA AUTORAL Ensaio -  

tutti - social network

Tutti is the simplest social network on internet. Here you can make friends, create communities, sell things, make surveys, comment and share stuff.

Those guys just turned thieves.They changed politic without even telling retaillers.Now they charge 3$ per month,and not fo 4 years anymore only 2 and they never sent me the real card just after the temporary.This is an other card,cause I lost the other in my house,while folding it cause of the stupid plombers company cause I did not put it back at the same place,but I ve found back my lost 64gb micro SD card,cause of the cousin and his familly.My mother paid me the 15$ + 5$ that where suposed to be left on the Canada Visa post card,she said cause I have done a over good work fo her fo free.But she have to collect my sister fo the bathroom work influence,fo the cousin influenced part to come over here,in my house,and fo the plomber company that she gave to my mother fo the week end before cousin arrival rush.And with this card we can t even use it in any stores,even those that accept Gift Cards.The company they do this to look like important people,cause of some high schools feedbacks.Fucken thieves.I bough the last card 1 year and a half ago and it s the same expiration date wroted on all cards.Ah ah ah!Fucken poors,they re already broke,what will happen after the costs of Gifts cards?
image
TORRE de ESTRADA.
Declara d bien cultural se halla en La Estrada de Val de San Vicente (Cantabria). Su origen se remonta al VIII, reconstruida de nuevo en el sg. XII y rehabilitada en el 2005 a su lado se encuentra una capilla que data del sg. XIII.
image
more