Django 模板标签从错误的日期显示对象

Posted

技术标签:

【中文标题】Django 模板标签从错误的日期显示对象【英文标题】:Django template tag displaying from wrong date for objects 【发布时间】:2013-12-04 10:25:48 【问题描述】:

我有一个 Django 模型(数据库是 PostgreSQL),其中包含发布日期的日期时间字段:

class Story(models.Model):
    ...
    pub_date = models.DateTimeField(default=datetime.datetime.now)
    ...

还有一个模板标签来获取给定月份和年份的这些对象:

from django import template
from news.models import Story

class StoryYearListNode(template.Node):
    def __init__(self, varname):
        self.varname = varname

    def render(self, context):
        context[self.varname] = Story.live.dates("pub_date", "year").reverse()
        return ''

def do_get_story_year_list(parser, token):
    """
    Gets a list of years in which stories are published.

    Syntax::

        % get_story_year_list as [varname] %

    Example::

        % get_story_year_list as year_list %
    """
    bits = token.contents.split()
    if len(bits) != 3:
        raise template.TemplateSyntaxError, "'%s' tag takes two arguements" % bits[0]
    if bits[1] != "as":
        raise template.TemplateSyntaxError, "First arguement to '%s' tag must be 'as'" % bits[0]
    return StoryYearListNode(bits[2])

class StoryMonthListNode(template.Node):
    def __init__(self, varname):
        self.varname = varname

    def render(self, context):
        context[self.varname] = Story.live.dates("pub_date", "month").reverse()
        return ''

def do_get_story_month_list(parser, token):
    """
    Gets a list of months in which stories are published.

    Syntax::

        % get_story_month_list as [varname] %

    Example::

        % get_story_month_list as month_list %
    """
    bits = token.contents.split()
    if len(bits) != 3:
        raise template.TemplateSyntaxError, "'%s' tag takes two arguements" % bits[0]
    if bits[1] != "as":
    raise template.TemplateSyntaxError, "First arguement to '%s' tag must be 'as'" % bits[0]
    return StoryMonthListNode(bits[2])

register = template.Library()
register.tag('get_story_month_list', do_get_story_month_list)
register.tag('get_story_year_list', do_get_story_year_list)

但是当我在模板上使用标签时,日期(以 get_story_month_list 为例)是从发布日期开始的一个月或一年:

% load date%

        % get_story_month_list as month_list %
        <ul class="list-unstyled">
        % for month in month_list %
            <li><a href=" month|date:"Y/M"|lower /"> month|date:"F Y" </a></li>
        % endfor %
        </ul>

知道我做错了什么吗?

【问题讨论】:

我认为这与您的问题无关,但DateTimeField 具有将其设置为“现在”的内置属性,auto_now_add。看到这个问题:***.com/questions/2771676/… 是的,我认为这与我的问题无关,但我感谢您提供的信息和链接! 所以看起来这是一个时区问题(相关:***.com/questions/11174225/…)。我可以通过在设置中关闭时区来解决这个问题,但理想情况下我想保持这个状态。这里的任何帮助都会很棒。 你读过这个页面吗? docs.djangoproject.com/en/dev/topics/i18n/timezones/…另外,也许你的浏览器没有正确的时区 这段代码是在 Django 1.5 中实现的。我升级到 1.6 并将函数 Story.live.dates("pub_date", "month").reverse() 更改为 Story.live.datetimes("pub_date", "month").reverse()。我得到了一个错误,而不是时区问题,这似乎已在下一次 Django 更新 (code.djangoproject.com/ticket/21432) 中得到解决。 【参考方案1】:

auto_now=True 在 django 1.4.1 中对我不起作用,但下面的代码救了我。

from django.utils.timezone import get_current_timezone
from datetime import datetime

class EntryVote(models.Model):
    voted_on = models.DateTimeField(auto_now=True)

    def save(self, *args, **kwargs):
        self.voted_on = datetime.now().replace(tzinfo=get_current_timezone())
        super(EntryVote, self).save(*args, **kwargs)

【讨论】:

以上是关于Django 模板标签从错误的日期显示对象的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.10 模板语法错误。您是不是忘记注册或加载此标签?

django url 模板标签的问题,% url %

Django 模板错误:无法解析剩余部分

django'url'模板标签错误

Django 自定义模板标签抛出错误

django 模板 URL 标签错误