如何比较Django中的日期

时间:2010-09-26 16:49:21

标签: python django django-templates

我想将日期与Django中的当前日期进行比较,最好是在模板中,但在渲染模板之前也可以这样做。如果日期已经过去,我想说“过去”,如果是将来,我想给出日期。

我希望有人可以这样做:

{% if listing.date <= now %} 
     In the past 
{% else %} 
     {{ listing.date|date:"d M Y" }} 
{% endif %}

现在是今天的约会,但这不起作用。我在Django文档中找不到任何相关内容。任何人都可以提出一些建议吗?

7 个答案:

答案 0 :(得分:88)

在视图中比较日期,并将类似in_the_past(布尔值)的内容传递给extra_context。

或者更好地将其作为属性添加到模型中。

from datetime import date

@property
def is_past_due(self):
    return date.today() > self.date

然后在视图中:

{% if listing.is_past_due %}
    In the past
{% else %}
    {{ listing.date|date:"d M Y" }}
{% endif %}

基本上,模板不是IMO日期比较的地方。

答案 1 :(得分:12)

从Django 1.8开始,以下稍微令人反感的构造就完成了这项工作:

{% now "Y-m-d" as todays_date %}
{% if todays_date < someday|date:"Y-m-d" %}
   <h1>It's not too late!</h1>
{% endif %}

Hackish,但它避免了对自定义标记或上下文处理器的需求。

答案 2 :(得分:9)

我将date_now添加到我的上下文处理器列表中。

所以在模板中有一个名为“date_now”的变量,它只是datetime.datetime.now()

在文件context_processors.py

中创建一个名为date_now的上下文处理器
import datetime

def date_now(request):
    return {'date_now':datetime.datetime.now()}

在settings.py中,修改CONTEXT_PROCESSORS以包含它,在我的情况下是

app_name.context_processors.date_now

答案 3 :(得分:1)

您始终可以传递datetime.datetime.now(因为django模型使用Python的标准日期时间对象)。

使用render_to_response,你可以做这样的事情(在导入datetime之后):

return render_to_response('template.html', {'now': datetime.datetime.now()})

现在您可以访问模板中的“now”,您可以像在示例中一样比较日期。

此外,如果在视图中使用RequestContext - 如果需要在多个文件中使用,则可以将“now”添加为context_processor。这将为使用RequestContext呈现的任何模板添加“now”。

但是,更简单的是,您只需获取原始查询集中之前的记录列表,并避免首先查询无用数据:

listing.objects.filter(date__lt=datetime.datetime.now())

答案 4 :(得分:1)

除了@ bx2有益的答案,如果你的字段是datetime字段,只需调用date()函数来建模datetimefield:

from datetime import date

@property
def is_past_due(self):
    if date.today() > self.date.date():
        return True
    return False

答案 5 :(得分:0)

我发现了这个问题并遇到了类似的问题。如果它只发生在过去,我希望显示信息。

在模板中使用Django的“timesince”标签,我能够解决我的问题。我不是说它有效,但它对我有用。

在模板中:

{% if model_name.date_time|timesince >= "1 min" %}
   <p>In the past</p>
{% else %}
   <p>{{ model_name.date_time }}</p>
{% endif %}

答案 6 :(得分:0)

我认为实现这一目标的最简单方法是在views.py中导入datetime并将今天的日期作为上下文数据传递。

context['today'] = datetime.date.today()

然后在模板标签中你可以做这样的事情。

 {% if listing.date < today % }

这样,如果您将对象列表作为上下文传递,则可以在HTML模板中输出过滤器时将过滤器应用于每一行。我有一个项目列表,我已经过滤掉了,并在我显示它们时使用Bootstrap进行样式化。我想让过期的日期脱颖而出,只有当我的一个日期少于今天的日期时才应用过滤。