我有一个使用DateField的模型:
end_date = models.DateField(default=datetime.date.today)
在模板中,我需要计算从现在开始到end_date的天数。 我试过了:
{% now "d m Y"|timeuntil:placement.end_date|date:"d m Y" %}
但它不起作用。如何获得该日期之前的天数?
答案 0 :(得分:1)
在模板中使用Django功能是有限制的。您可以通过组合timesince and timuntil方法来计算两个日期之间的差异来解决这个问题。但是,如果在python视图中执行此操作,然后将结果传递给模板,您将从中受益更多。
通过这种方式,您可以真正使用Datetime的强大功能。因此,在views.py和呈现模板的特定函数中,包括:
d0 = datetime.now().date()
d1 = placement.end_date
delta = d0 - d1
print delta.days
您可以阅读有关日期时间文档here的更多信息。现在,您可以在上下文中传递该变量,或者单独传递以由模板
呈现答案 1 :(得分:0)
选项1:创建自定义过滤器
创建一个自定义过滤器功能,该功能可获取当前日期并计算日期。
您只需在模板中使用:
{{ placement.end_date | days_until }}
要定义和注册过滤器,请将以下代码包含在python文件中:
from datetime import datetime
from django import template
register = template.Library()
@register.filter
def days_until(date):
delta = datetime.date(date) - datetime.now().date()
return delta.days
有关Django自定义模板标签和过滤器here.
的更多信息选项2:计算视图中的日期并将其存储在上下文中
这一天很简单。您计算天数并将信息存储在上下文中:
from datetime import datetime
delta = placement.end_date - datetime.now().date()
context['days_left'] = delta.days
您可以在模板中直接访问它:
{{ days_left }}
但是,如果要将“展示位置”列表传递给模板,则必须将该新信息“附加”到每个展示位置。这是一个不同的主题,实现取决于项目...您可以在放置位置上创建包装器...或将days_left存储在其他词典中...
答案 2 :(得分:0)
因为我喜欢 Django 内置过滤器
<块引用>时间以来
将日期格式化为自该日期起的时间(例如,“4 天 6 小时”)。
接受一个可选参数,该参数是一个包含日期的变量 用作比较点(没有参数,比较 点是现在)。例如,如果 blog_date 是一个日期实例 代表 2006 年 6 月 1 日午夜,而 comment_date 是一个日期 2006 年 6 月 1 日 08:00 的实例,则以下将返回“8 小时”:
{{ blog_date|timesince:comment_date }}
<块引用>
比较天真偏移和感知偏移的日期时间将返回一个空的 字符串。
分钟是使用的最小单位,返回“0分钟” 相对于比较点的未来任何日期。