Django中如何提取datetime.timedelta对象的整数天数解决类型报错
解决方案
两个日期对象相减默认返回datetime.timedelta实例,你只需要提取该实例的days属性,即可得到整数类型的天数差值。
核心代码修改
将原视图中计算天数的部分:
num_days = end_date - start_date num_weeks = math.ceil(num_days/7)
修改为:
# 从timedelta对象提取整数类型的天数差值 num_days = (end_date - start_date).days # 可选:避免用户输入的结束日期早于开始日期时出现负数 num_days = max(0, num_days) num_weeks = math.ceil(num_days / 7)
修改后num_days就是纯整数,不会再触发类型错误,同时原逻辑中counter <= num_days的判断也可以正常运行。
完整修正后的视图函数
def timeSheetFiltered(request): end_date = forms.DateField().clean(request.GET.get('end-date')) start_date = forms.DateField().clean(request.GET.get('start-date')) # 修正:获取整数类型的天数差值 num_days = (end_date - start_date).days num_days = max(0, num_days) num_weeks = math.ceil(num_days/7) week_pack = [] counter = 0 while counter <= num_days: week_pack.append(start_date + timedelta(days=counter)) counter = counter + 1 shifts = Shift.objects.filter(time_added__range = [start_date,end_date]) context = { 'shifts': shifts, 'start_date': start_date, 'end_date': end_date, 'week_pack': week_pack, 'num_weeks': num_weeks } return render(request, 'shifts/timeSheetFiltered.html', context)
注意事项
- 两个
date类型相减的timedelta不存在时分秒精度问题,days属性返回值就是实际的自然日差值 - 若业务逻辑允许结束日期早于开始日期,可以去掉
num_days = max(0, num_days)的限制
内容的提问来源于stack exchange,提问作者Chilusoft
相关产品推荐
相关产品推荐

