{{ comment.time_added | localtime }}
{{ comment.time_added | localtime | date :"dmY" }}
{% localtime comment.time_added %}
{% localtime comment.time_added as time_added %}{{ time_added | date :"dmY" }}
class TimezoneMiddleware ( object ):
"""
request timezone
"""
def process_request ( self , request):
assert hasattr (request, 'session' ), "*.TimezoneMiddleware requires session middleware to be installed."
request . timezone = get_timezone(request)
request . session[ 'timezone' ] = request . timezone
return None
get_timezone()
function will depend on the application and may look like this:def get_timezone (request):
#
if hasattr (request, 'user' ) and request . user . is_authenticated():
profile = request . user . get_profile()
if profile . timezone:
return profile . timezone
#
if request . session . has_key( 'timezone' ):
return request . session[ 'timezone' ]
# IP,
city_id = ip_to_city_id(request . META[ 'REMOTE_ADDR' ])
if city_id:
try :
city = City . objects . get(pk = city_id)
if city . timezone:
return city . timezone
except City . DoesNotExist:
pass
#
return pytz . timezone(settings . FALLBACK_TIMEZONE)
import pytz
from django.utils.thread_support import currentThread
_active = {}
def default_timezone ():
"""
.
"""
from django.conf import settings
_default_timezone = pytz . timezone(settings . TIME_ZONE)
global default_timezone
default_timezone = lambda : _default_timezone
return _default_timezone
def activate (tz):
if isinstance (tz, pytz . tzinfo . BaseTzInfo):
_active[currentThread()] = tz
else :
_active[currentThread()] = pytz . timezone(tz)
def deactivate ():
global _active
if currentThread() in _active:
del _active[currentThread()]
def get_timezone ():
tz = _active . get(currentThread(), None )
if tz is not None :
return tz
return default_timezone()
def to_active (dt):
tz = get_timezone()
if dt . tzinfo is None :
dt = default_timezone() . localize(dt)
return dt . astimezone(tz)
def to_default (dt):
if dt . tzinfo is None :
return default_timezone() . localize(dt)
else :
return dt . astimezone(default_timezone())
activate()
function sets the current time zone, deactivate()
returns the default belt. to_default()
and to_active()
convert the time to the server belt or current. It remains to write your own model field:class TimezoneDateTimeField (models . DateTimeField):
__metaclass__ = models . SubfieldBase
def _to_python ( self , value):
"""
datetime
"""
return super (TimezoneDateTimeField, self ) . to_python(value)
def to_python ( self , value):
"""
datetime.
"""
if value is None :
return value
return timezone . to_active( self . _to_python(value))
def get_db_prep_value ( self , value):
"""
"""
if value is not None :
value = timezone . to_default( self . _to_python(value))
return connection . ops . value_to_db_datetime(value)
TimezoneMiddleware
:class TimezoneMiddleware ( object ):
def process_request ( self , request):
...
timezone . activate(request . timezone)
return None
def process_response ( self , request, response):
timezone . deactivate()
return response
DateTimeField
with our field and time is magically transformed everywhere: in templates, in forms, and in the admin panel. Of course, there is no limit to perfection, you can implement your own form field for hanging the active time zone for the time received from the user, you can write a filter for those cases when third-party applications are used and their models are not with our fields. What I did in one project about the ski vacation , for which all this code was written.TimezoneDateTimeField
will need to be completed in accordance with the update instructionsSource: https://habr.com/ru/post/94230/
All Articles