我想将日期与Django中的当前日期进行比较,最好是在模板中,但在渲染模板之前也可以这样做。如果日期已经过去,我想说“过去”,如果是将来,我想给出日期。
我希望有人可以这样做:
{% if listing.date <= now %}
In the past
{% else %}
{{ listing.date|date:"d M Y" }}
{% endif %}
现在是今天的约会,但这不起作用。我在Django文档中找不到任何相关内容。任何人都可以提出一些建议吗?
答案 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进行样式化。我想让过期的日期脱颖而出,只有当我的一个日期少于今天的日期时才应用过滤。