我的博客应用程序中有一个简单的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/
请帮助或提供解决此问题的提示。
答案 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_TZ
和TIME_ZONE
saves your datetimes in UTC。每当Django从数据库中检索日期时间时,它都会丢失其时区。