在Django项目中根据用户更改时区

8

我正在尝试根据用户选择更改项目的时区。

为此,我在我的数据库中有一个字段,保存所有可能的位置:

timezone = models.CharField(max_length=40, null=True, blank=True, choices=[(n,n) for n in pytz.all_timezones])

但问题是,当我尝试更改时区时,它无法正常工作。

---- setting.py ----

USE_TZ = True
TIME_ZONE = 'Europe/Madrid'

---- 仪表板 (view.py) ----> 输出


@login_required
def dashboard(request):
    from datetime import datetime, timedelta    
    import pytz

    print "Normal:" + str(datetime.now()) # Normal:2018-04-19 08:39:51.484283
    print "TimeZone:" + str(timezone.now()) # TimeZone:2018-04-19 06:39:51.484458+00:00

    u = User.objects.get(user=request.user) # u: Alejandroid
    timezone_selected = u.timezone # timezone_selected: u'Canada/Saskatchewan'
    timezone.activate(pytz.timezone(timezone_selected))

    print "Normal:" + str(datetime.now()) # Normal:2018-04-19 08:40:02.829441
    print "TimeZone:" + str(timezone.now()) # TimeZone:2018-04-19 06:40:04.329379+00:00

如您所见,它只返回在TIME_ZONE中定义的本地时间和UTC时间。 我正在使用Django 1.8。如何使其工作?非常感谢。
我的解决方案:您需要创建一个中间件。
class TimezoneMiddleware(object):

    def process_request(self, request):
        from django.utils import timezone
        import pytz
        from settings import TIME_ZONE
            if request.user.is_authenticated():
                timezone_selected = request.user.timezone
                if not timezone_selected:
                    timezone_selected = TIME_ZONE
                timezone.activate(pytz.timezone(timezone_selected))
            else:
                timezone.deactivate()

你是从哪里选择时区的?这是一种用户配置文件字段类型还是.timezone是请求对象内部的属性? - Luis Rodriguez
1个回答

0

Django的设置假定您将使用datatime:

从datetime导入datetime

datetime.now()

或者

datetime.now().strftime("%Y/%m/%d %H:%M")

只需使用这些函数代替timezone.now()

在settings.py中添加:

USE_TZ = True TIME_ZONE = 'UTC' # UTC == madrid/europe


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接