根据 django 项目中的用户更改时区

Posted

技术标签:

【中文标题】根据 django 项目中的用户更改时区【英文标题】:Change time zone depending on the user in django project 【发布时间】:2018-09-29 13:32:30 【问题描述】:

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

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

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 是请求对象内的属性? 【参考方案1】:

Django 设置假定您将使用数据时间:

从日期时间导入日期时间

datetime.now()

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

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

并在 settings.py 中添加:

USE_TZ = 真 TIME_ZONE = 'UTC' # UTC == 马德里/欧洲

【讨论】:

以上是关于根据 django 项目中的用户更改时区的主要内容,如果未能解决你的问题,请参考以下文章

使用JS根据输入时区更改时间

Php:根据用户更改时区[重复]

为啥Django时区设置会影响纪元时间?

如何根据用户输入动态更改 django 中的表单(提交前)

Django 中的时区

将celery定时任务设置为根据本地时区触发