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

标签 python django templates datetime templatetag

我有一个 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>

知道我做错了什么吗?

最佳答案

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)

关于python - Django 模板标签显示对象的错误日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20095753/

相关文章:

django - 如何在 Django 的相关模型中按带注释的 Count() 进行排序

c++ - 双向链表模板复制构造函数赋值运算符

C++ 模板 : no matching function for call

Python-类对象属性 setter 不起作用

python - 使用外键在 Django 中抽象基类继承

python - 如何划分两个DataFrame

python - 如果输入参数在 Django 模板中无效,如何抛出异常

python - __init__ 形式 Django 中的查询集

python - 如何使用 Python 从 GeoServer 下载 GeoTiff 文件

c++ - 这在 C++ 模板中意味着什么?