models.py
import datetime as dt
class Campaign(models.Model):
enddate = models.DateField()
def rest_of_the_day(self):
now = dt.datetime.now().date()
print('printing now value')
print(now)
print(self.campaign_enddate)
return (self.campaign_enddate-now).days
in views.py
def landing_page(request):
campaigns = Campaign.objects.all().order_by('-id')
return render(request, 'core/landing_page.html',{'campaigns':campaigns})
在html模板中
<span>{{campaign.rest_of_the_day}}</span>
我正在尝试使用Model.py中的rest_of_the_day函数在html文件中存储结束日期并显示到结束日期为止的天数
例如:如果结束日期为2010年1月30日,今天为2020年1月15日,我希望rest_of_the_day显示15
但是,我在/不受支持的操作数类型处收到 TypeError-:'NoneType'和'datetime.date'
答案 0 :(得分:2)
似乎self.campaign_enddate
是None
。这很有意义,因为它不是您定义的字段。您可以使用enddate
:
class Campaign(models.Model):
enddate = models.DateField()
def rest_of_the_day(self):
return (self.enddate-dt.date.today()).days
不过,您可以在此处使用|timeuntil
template filter [Django-doc]:
<span>{{ campaign.enddate|timeuntil }}</span>
这样可以更方便地处理直到某个日期(时间)发生为止的时间。
答案 1 :(得分:1)
另一种选择是在查询中使用database functions将列添加到QuerySet结果中。
这里QuerySet结果中的每个广告系列对象的td
列的类型为datetime.timedelta
。
from django.db.models.functions import Extract, Now, Trunc
campaigns = Campaign.objects.all().order_by('-id').annotate(
td=F('enddate') - Now()
)
或添加Trunc结果td
列将是datetime.timedelta
个对象,只有几天
我们还需要将日期和日期时间之间的计算转换为一种类型/ output_field。
campaigns = Campaign.objects.all().order_by('-id').annotate(
td=Trunc(
F('enddate') - Now(),
'day',
output_field=models.DateField()
)
)
请注意,您将在datetime.timedelta
对象上进行操作。此外,由于要四舍五入和减去天数,因此在不同部分(Trunc
,Now()
,F('enddate')
,不同组合)上加上whole expression
可能会产生略有不同的结果。您可以尝试一下。
要获得整数(天)的结果,可以将Extract函数添加到组合中:
campaigns = Campaign.objects.all().order_by('-id').annotate(
td=Extract(
F('enddate') - Trunc(Now(), 'day', output_field=models.DateField()),
'day'
)
)
这里td
将是整数。