Я пытаюсь отфильтровать туры на основе даты в Django 2.0, то есть показать все туры, которые начинаются 1 июня 2019 года или после этой даты (должны быть получены из формы).У меня есть модель 'Тур':
class Tour(models.Model):
destination = models.ForeignKey(Destination, on_delete=models.PROTECT)
Created = models.DateTimeField(auto_now_add=True)
Updated = models.DateTimeField(auto_now=True)
Available = models.BooleanField(default=True, help_text="Tick it if you still operate this tour")
И у меня есть модель 'Вылет':
class Departures(models.Model):
tour = models.ForeignKey(Tour, on_delete=models.CASCADE)
DepartingDate = models.DateField(auto_now=False)
FinishingDate = models.DateField(auto_now=False)
DepartureStatus = models.CharField(max_length=200, choices = DEPARTURE_STATUS, help_text="Select from the list")
PlacesAvailable = models.BooleanField("Places avalable", default="True")
DepartureGaranteed = models.BooleanField("Departure Garanteed", default="True")
Я хочу, чтобы пользователь должен выбрать дату начала тура из HTMLform:
<div class="form-group">
<input class="form-control" id="dateStart" name="DateStart" type="date"/>
</div>
У меня есть форма в моем models.py:
class SearchForm(forms.Form):
Country = forms.CharField(max_length=255, required=False)
TourType = forms.CharField(max_length=255, required=False)
TourTheme = forms.CharField(max_length=255, required=False)
Duration = forms.IntegerField(required=False) #, blank=True
Price = forms.CharField(max_length=255, required=False) #, blank=True
DateStart = forms.DateField(required=False) #input_formats='%d/%m/%Y',
EDITED (добавлена функция просмотра):
def search_tours(request):
if request.method == 'GET':
form = SearchForm(request.GET)
if form.is_valid():
Country = form.cleaned_data['Country']
TourType = form.cleaned_data['TourType']
TourTheme = form.cleaned_data['TourTheme']
Duration = form.cleaned_data['Duration']
Price = form.cleaned_data['Price']
DateStart = form.cleaned_data['DateStart']
#Convert the date format
# DateStart = datetime.strptime(str(DateStart), '%Y-%m-%d')
# DateStart.strftime('%Y/%m/%d')
# DateStart.strftime("%Y-%m-%d")
departures = Departures.objects.all()
myfilter = Q()
if Country is not None:
for c in Country:
myfilter &= Q(destination__Country__icontains=c)
if TourType is not None:
myfilter &= Q(TourType__contains=TourType)
if TourTheme is not None:
myfilter &= Q(TourTheme__contains=TourTheme)
if Duration is not None:
myfilter &= Q(Duration__lte=Duration)
if Price in request.GET:
myfilter &= Q(Price__lte=Price)
if DateStart in request.GET:
myfilter &= Q(Departures__DepartingDate__gt=DateStart)
tours = Tour.objects.filter(myfilter)
paginator = Paginator(tours, 3) # Show 3 tours per page
page = request.GET.get('page')
tours = paginator.get_page(page)
args = {'tours': tours, 'departures': departures,
'Country': Country,
'TourType': TourType,
'TourTheme': TourTheme,
'Price' : Price,
'Duration' : Duration,
}
return render(request, 'tours/search_tours.html', args)
else:
return HttpResponseRedirect('../error/')
else:
form = SearchTourForm()
tours = Tour.objects.filter(Available = True)
return render(request, 'tours/search_tours.html', {
'tours': tours,
})
Итак, япытаясь отфильтровать туры, как показано ниже:
tours = Tour.objects.filter(Q(Departures__DepartingDate__gt=DateStart))
Но это не работает.Я предполагаю, что проблема в том, что формат даты в формате HTML и формат даты django db не совпадают.Не выдает ошибку, но не фильтрует.Просто показывает весь тур.
Как я могу привести эти две даты в один и тот же формат и сравнить?Как исправить эту ошибку?