2017-02-04 114 views
0

在我的网站上,我有一个页面,您可以通过JavaScript日历小部件输入开始日期和结束日期。它将查询数据库并返回结果。这是我的看法Django date__range query-如果日期范围在当前日期结束,则添加1天

class flagfilter(ListView, View): 
form_class = FlagReportForm 
template_name = 'free/flagreport.html' 
paginate_by = 20 

def get(self, request): 
    form = self.form_class(None) 
    return render(request, self.template_name, {'form': form}) 


def post(self, request): 
    form = self.form_class(request.POST) 

    if form.is_valid(): 
     start_date = request.POST.get('start_date', '') 
     end_date = request.POST.get('end_date', '') 
     user = request.user 
     s = datetime.datetime.strptime(str(start_date), '%m/%d/%Y') 
     e = datetime.datetime.strptime(str(end_date), '%m/%d/%Y') 
     if e == s: 
      e = e + datetime.timedelta(days=2) 
     s_filtered = s.strftime('%Y-%m-%d') 
     e_filtered = e.strftime('%Y-%m-%d') 
     punch = Punch.objects.filter(date__range=[str(s_filtered),str(e_filtered)]).order_by('-date') 
     punches = punch.filter(user=user) 
     context = {'punches': punches} 
     return render(request, 'free/flagreport2.html', context) 

    return render(request, self.template_name, {'form': form}) 

我的问题是,如果你有一个日期范围在今天的日期结束它不会返回当天的对象。我加了这一行:

 if e == s: 
     e = e + datetime.timedelta(days=2) 

我这样做是因为,如果你有开始和结束日期,因为它不会返回今天的冲对象的当前日期。这解决了这个问题,但我仍然有问题。如果您输入的日期范围的开始日期,可以说上周某个时间。结束日期是当天。它仍然不会返回当前的日子冲突对象。所以我想用一些检查结束日期是否是当前日期的东西来代替这段代码,如果是这样,请在结束日期添加一天。我尝试了一些东西,但不能得到任何工作。任何帮助表示赞赏!

回答

0

好的,所以我只注意到无论选择哪个日期作为结束日期,都会发生同样的事情。结束日期结果不会返回。所以加入

e = e + datetime.timedelta(days=) 

应该解决我的问题!

0

你可以尝试使用

Punch.objects.filter(date__gte=s, date__lte=e).order_by('-date') 

代替date__range,我认为应该救你不必使用strftime的任何timedelta东西

编辑:我不认为Q甚至需要

+0

strmstime的东西是将我的小部件的格式转换成Django喜欢的格式。但是我从来没有见过你刚刚分享的代码。我必须做一些阅读! –

+0

这个想法是使用gte和lte(大于或等于/小于等于),所以查询进入数据> = 2017-01-01和日期<= 2017-01-30而不是日期> = 2017-01- 01和日期<2017-01-30。小于等于应该使它,所以你不必处理添加额外的日子 –

+0

感谢您的信息! –