Django Timezone不知道DateTimeField错误

时间:2018-03-09 20:23:26

标签: python django

我的博客应用程序中有一个简单的Post模型如下:

class Post(CreateUpdateDateModel):
    # ...
    body = models.TextField()
    publish = models.DateTimeField()
    # ...

    def get_absolute_url(self):
        print(self.publish) # printing publish date
        return reverse(
            'blog:post_detail',
            args=(
                self.publish.year,
                self.publish.month,
                self.publish.day,
                self.slug
            )
        )

在我的settings.py中,我有:

TIME_ZONE = 'Asia/Kolkata'

USE_TZ = True

我正在使用Django Admin创建Post实例。 Django Admin显示/显示正确的时间(当地时间,3月10日)。使用get_absolute_url方法打印发布日期会显示2018-03-09 19:54:29+00:00(3月9日)。这会导致在访问帖子时生成错误的网址导致错误:DoesNotExist at /blog/2018/3/9/third-blog-normal/

请帮助或提供解决此问题的提示。

1 个答案:

答案 0 :(得分:2)

要根据服务器的本地时间生成绝对网址,输入get_absolute_url()的时间只需在当地时区:

from django.utils.timezone import localtime

class Post(CreateUpdateDateModel):
    # ...
    body = models.TextField()
    publish = models.DateTimeField()
    # ...

    def get_absolute_url(self):
        local_publish = localtime(self.publish)
        return reverse(
            'blog:post_detail',
            args=(
                local_publish.year,
                local_publish.month,
                local_publish.day,
                self.slug
            )
        )

这里的真正教训是,尽管他们的名字有所建议,但仍然设置USE_TZTIME_ZONE saves your datetimes in UTC。每当Django从数据库中检索日期时间时,它都会丢失其时区。