我现在正在读《Django by Example》一书。
我在查找带有参数的记录时遇到问题。
我的代码如下所示:
设置.py
TIME_ZONE = 'Asia/Seoul'
型号.py
...
published = models.DateTimeField(default=timezone.now)
...
views.py
def post_show(request, year, month, day, slug):
post = get_object_or_404(Post,
slug=slug,
status='published',
published__year=year,
published__month=month,
published__day=day)
return render(request, 'blog/default/post/show.html', {'post': post})
urls.py
url(r'^(?P<year>d{4})/(?P<month>d{2})/(?P<day>d{2})/(?P<slug>[-w]+)/$',
views.post_show, name='post_show'),
MVT运行良好,但我认为DateTimeField、TimeZone或SQLite3有问题。
在SQLite3中,"已发布"DateTimeField的值为:"2016-05-17 19:57:03",即UTC时间。我提前9小时到达亚洲/首尔。所以我实际上是在5月18日凌晨4:57发布的。
>>> p = get_object_or_404(Post,slug='test', published__year=2016, published__month=5, published__day=18)
>>> p.title
'test'
>>> p.published
datetime.datetime(2016, 5, 17, 19, 57, 3, tzinfo=<UTC>)
DB说它将于17日发布,但我必须传递参数"18"。如果我过了17分,就得404分。
如何强制筛选条件使用UTC时区?
我自己回答我的帖子。我看了手册,上面写着。
当USE_TZ为True时,日期时间字段将在筛选之前转换为当前时区。
我更改了get_absolute_url()方法,将UTC转换为亚洲/首尔时区:
def get_absolute_url(self):
# this line was added.
published_localtime = timezone.localtime(self.published)
return reverse('blog:post_show',
args=[
published_localtime.year,
published_localtime.strftime('%m'),
published_localtime.strftime('%d'),
self.slug
我是这样修复的,但如果我有,我想知道更好的方法。非常感谢。