我的博客是用 Django 1.4.1 构建的。该博客没有什么特别之处,主要是 Django 教程和书籍中的示例。数据库是 PostgreSQL。我尝试使用尽可能多的通用东西,包括站点地图框架。不幸的是,生成的站点地图显示时区问题。
博客条目模型中的字段“pub_date”具有 DateTimeField 类型。博客的时区是“欧洲/阿姆斯特丹”。如果我在博客管理界面中输入日期和时间,那么数据库中的列具有正确的值(例如 2012 JUL 10 00:00 管理界面 => 2012 JUL 09 22:00 UTC PostgreSQL)。函数 Blog.get_absolute_url() 确实产生 /2012/07/09/slug。我希望 UTC 日期(这对我来说很好)
我的urls.py就像所有的例子一样。
info_dict = {
'queryset': Blog.objects.all(),
'date_field': 'pub_date',
}
url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$', 'django.views.generic.date_based.object_detail', info_dict),
(注意:我在这里使用基于函数的通用视图,但我也尝试了基于类的视图。两个视图都产生相同的问题)。
问题是:可以使用 get_absolute_url() 中的值找到每个博客条目,但不能找到具有不同本地时区日期和 UTC 的条目(例如 2012 JUL 10 00:00 local => 2012 JUL 09 22:00世界标准时间)。我确实得到了“404”,并且 - 使用 runserver 运行时 - 错误是RuntimeWarning: DateTimeField received a naive datetime (2012-07-09 23:59:59.999999) while time zone support is active。
我在网上的搜索确实显示了很多关于 Django 时区问题的帖子。它们中的大多数确实与基于日期的档案的月份格式有关。我正在使用最新的 Django 版本 1.4.1 进行大多数修复。我在 date_based.object_detail 或与时区相关的 DateDetailView 的教程或书籍中没有找到任何示例。目前,我怀疑正确的方法。
可能不是一个好主意
- 我可以放松“时区”意识(USE_TZ = False),但这忽略了问题
- 我可以更改 *get_absolute_url()* 以生成本地时区的日期(在此示例中为 2012/07/10/slug),但随后我将数据库格式和用户格式混合在一起
不知道这是否是一个好(或可行)的想法
- 使用字典 info_dict 执行某些操作以通知通用视图 pub_date 是 UTC 格式。我找不到办法做到这一点
- 使用字典来更改日期时间格式(例如 pub_date.date),但这会产生语法错误。此外,Django 文档说 DateField 和 DateTimeField 支持通用视图
有什么好方法?关注 pub_date 以转换为 DateField,处理视图以接受 DateTimeField,从通用视图切换到自制视图,还是其他?
Django 解决此问题的最常用方法是什么?