如何在模板

时间:2018-01-22 14:13:45

标签: python django postgresql

我正在使用PostgreSQL存储一个DateTimeField的对象 DateTimeField正在使用auto_now_add个选项 它是由Django Rest Framework中的序列化程序自动创建的。

Django docs所述,我试图获取当地时区并将其激活。

from django.utils.timezone import localtime, get_current_timezone

tz = get_current_timezone()
timezone.activate(tz)
session.started_at = localtime(session.started_at)

在模板index.html中,我还尝试加载时区。

{% localtime on %}
   Session: start time {{ item.session.started_at }} 
{% endlocaltime %}

settings.py

USE_TZ = True
TIME_ZONE = 'UTC'

我正在使用GMT + 7时区,但它仍然在模板上显示UTC时间。

我正在使用Django开发服务器进行测试。

我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

如果我没弄错,TIME_ZONE设置会设置“本地”时区,请将其从UTC更改为您当地的时区。

没有HTTP-Header将服务器显示为客户端的时区。大多数使用本地化时间的网站会询问用户他们所在的时区,并将其保存在用户个人资料中。请参阅Django文档 https://docs.djangoproject.com/en/2.0/topics/i18n/timezones/#selecting-the-current-time-zone

Javascript有一种访问UTC偏移的方法,也许您可​​以使用它来将信息与请求一起发送到您的服务器。

答案 1 :(得分:1)

找到用户的时区后,请在Django 2及更高版本中执行此操作:

{% load tz %}
{% timezone "Europe/Paris" %}
    Paris time: {{ object.date }}
{% endtimezone %}

答案 2 :(得分:0)

假设您的所有日期时间都以UTC格式存储在数据库中,您可以在模板中使用tz django实用程序将日期投射到当地时间

IE如果日期时间存储为2017年10月12日18:00:00,我想将其转换为America/La_Paz当地时间(GMT -4)我可以使用

Session: start time {{ item.session.started_at|timezone:"America/La_Paz" }}

在模板中将显示到America / La_Paz的当地时间(本例中为2017年10月12日14:00:00)

模板/ my_template.html

{% load tz %}
<!-- some html code here -->
Session: start time {{ item.session.started_at|timezone:"America/La_Paz" }}

你可以在你的视图中创建一个cotext var或var来设置你用来在tmeplate中投射日期的时区,并使用它来进行投射

在您的观点中

my_timezone = 'A VALID TIMEZONE NAME'

再次在你的模板中

模板/ my_template.html

{% load tz %}
<!-- some html code here -->
Session: start time {{ item.session.started_at|timezone:my_timezone}}

答案 3 :(得分:0)

您的Web应用程序的用户可能处于不同的时区,因此有必要转换为适当的时区。您可以创建中间件并使用activate函数设置当前时区。要获取适当的时区,您可以在登录页面中对 Free IP Geolocation API 进行ajax api调用,时区值可以保存在cookie变量中,以后可以在中间件中进行访问

landingpage.html

<script>
$.ajax({
        url: 'https://freegeoip.app/json/',
        dataType: 'json',
        success: function (data) {
            document.cookie = 'timezone=' + data['time_zone'] + '; path=/';
        }
      });
</script>

middleware.py

import pytz
import requests

from django.utils import timezone

class TimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

def __call__(self, request):
    
    tzname = request.COOKIES.get('timezone')
    if tzname:
        timezone.activate(pytz.timezone(tzname))
    else:
        timezone.deactivate()
    return self.get_response(request)

settings.py

MIDDLEWARE = [      ........
            'projectname.middleware.TimezoneMiddleware',

]