Datetime Django 1.5-Python2.7-TIME_ZONE在登录时未正确设置(从自定义用户字段),直到重新加载第一页
我的问题是,我已经在Django中设置了自定义用户时区设置,并且它只在重新加载第一页后正确设置时区值。当前,如果用户登录,他会看到默认时区设置(“美国/纽约”),然后在第一次刷新时会看到自己的时区设置正确(即-“美国/温哥华”) 这是我的中间件Datetime Django 1.5-Python2.7-TIME_ZONE在登录时未正确设置(从自定义用户字段),直到重新加载第一页,datetime,python-2.7,timezone,django-1.5,pytz,Datetime,Python 2.7,Timezone,Django 1.5,Pytz,我的问题是,我已经在Django中设置了自定义用户时区设置,并且它只在重新加载第一页后正确设置时区值。当前,如果用户登录,他会看到默认时区设置(“美国/纽约”),然后在第一次刷新时会看到自己的时区设置正确(即-“美国/温哥华”) 这是我的中间件 from django.utils import timezone class TimezoneMiddleware(object): def process_request(self, request): tz = reque
from django.utils import timezone
class TimezoneMiddleware(object):
def process_request(self, request):
tz = request.session.get('django_timezone')
if tz:
timezone.activate(tz)
这是我的登录视图,它使用pytz计算从数据库中的用户获取的字符串时区,并将其放入会话中。初次登录后,时区不会被时区反映出来。如果我的模板中有{TIME_ZONE}},它将显示为默认设置“America/New_York”。单页刷新后,它显示为用户设置的“America/Vancouver”
def login_view(request):
if request.method == 'POST':
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user is not None:
if user.is_active:
login(request, user)
request.session['user'] = user
userdetails = user.get_profile()
request.session['django_timezone'] = pytz.timezone(userdetails.timezone)
# Prioritize favorite company in index list of companies
return companyHome(request, userdetails.get_favorite_company_id())
这是我在时区提交模板中的表单,它按预期工作并在使用时设置时区
<form action="{% url 'onBaristaApp:set_timezone' %}" method="POST">
{% csrf_token %}
<label for="timezone">Time zone:</label>
<select name="timezone">
{% for tz in timezones %}
<option value="{{ tz }}"{% if tz == TIME_ZONE %} selected="selected"{% endif %}>{{ tz }}</option>
{% endfor %}
</select>
<input type="submit" value="Set" />
</form>
以下是自定义用户配置文件上的相关模型字段
class UserProfile(models.Model):
...
timezone = models.CharField(max_length=50, default='America/New_York')
...
这是发生问题的模板
{% extends "base.html" %}
{% load url from future %}
{% load tz %}
{% get_current_timezone as TIME_ZONE %}
{% block body_tag %} home {% endblock %}
{% block contents %}
...
{% for check_in_object in location.get_checkins %}
{% localtime on %}
...
{{ check_in_object }}{{ check_in_object.get_tzobject }}
...
{% endlocaltime %}
...
{% endblock %}
下面是get_tzobject方法的代码,该方法显示时间以及模型和字段
class checkIn(models.Model):
...
inTime = models.DateTimeField(null=True)
outTime = models.DateTimeField(null=True)
checkedin = models.BooleanField(default=True)
...
def get_tzobject(self):
if self.checkedin:
timezone_corrected_time = localtime(self.inTime)
else:
timezone_corrected_time = localtime(self.outTime)
activate(timezone_corrected_time.tzinfo)
return timezone_corrected_time
我可以通过在我的登录视图代码中添加timezone.activate(pytz.timezone(userdetails.timezone))来解决这个问题
def login_view(request):
if request.method == 'POST':
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user is not None:
if user.is_active:
login(request, user)
request.session['user'] = user
userdetails = user.get_profile()
timezone.activate(pytz.timezone(userdetails.timezone))
request.session['django_timezone'] = pytz.timezone(userdetails.timezone)
# Prioritize favorite company in index list of companies
return companyHome(request, userdetails.get_favorite_company_id())
def login_view(request):
if request.method == 'POST':
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user is not None:
if user.is_active:
login(request, user)
request.session['user'] = user
userdetails = user.get_profile()
timezone.activate(pytz.timezone(userdetails.timezone))
request.session['django_timezone'] = pytz.timezone(userdetails.timezone)
# Prioritize favorite company in index list of companies
return companyHome(request, userdetails.get_favorite_company_id())