2

我的博客是用 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 的教程或书籍中没有找到任何示例。目前,我怀疑正确的方法。

可能不是一个好主意

  1. 我可以放松“时区”意识(USE_TZ = False),但这忽略了问题
  2. 我可以更改 *get_absolute_url()* 以生成本地时区的日期(在此示例中为 2012/07/10/slug),但随后我将数据库格式和用户格式混合在一起

不知道这是否是一个好(或可行)的想法

  1. 使用字典 info_dict 执行某些操作以通知通用视图 pub_date 是 UTC 格式。我找不到办法做到这一点
  2. 使用字典来更改日期时间格式(例如 pub_date.date),但这会产生语法错误。此外,Django 文档说 DateField 和 DateTimeField 支持通用视图

有什么好方法?关注 pub_date 以转换为 DateField,处理视图以接受 DateTimeField,从通用视图切换到自制视图,还是其他?

Django 解决此问题的最常用方法是什么?

4

2 回答 2

3

几个小时以来,我一直在努力解决这个确切的问题。关键是我的 get_absolute_url 逻辑导致 UTC 响应,但 DateDetailView 期望 URL 与本地时区匹配。

对于 get_absolute_url,我的解决方案如下:

from django.utils import timezone

class MyModel(models.Model):
# Other model code here

def _get_absolute_url(self):
    local_pub_date = timezone.localtime(self.entry.pub_date)
    return ('%sblog_detail', (), {
        'year': local_pub_date.year,
        'month': local_pub_date.strftime('%m'),
        'day': local_pub_date.strftime('%d'),=
        'slug': self.slug
    })
get_absolute_url = models.permalink(_get_absolute_url)

这似乎适用于我的目的。不过,我所有的用户都在同一个时区,所以它可能不适合用户群更多样化的网站。

-PT

于 2013-01-07T20:23:31.727 回答
0

我遇到了同样的问题,因为我的 get_absolute_url 显示的是下一个日期。我到处搜索,找不到任何可以帮助最新 Django 版本的东西。我对您的唯一建议是将日期和时间设置为数据库中的单独字段。

于 2012-09-15T17:55:36.280 回答