Как сравнить дату из формы с датой из БД в запросе Django? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь отфильтровать туры на основе даты в 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 не совпадают.Не выдает ошибку, но не фильтрует.Просто показывает весь тур.

Как я могу привести эти две даты в один и тот же формат и сравнить?Как исправить эту ошибку?

1 Ответ

0 голосов
/ 01 февраля 2019

Поэтому я решил изменить имя модели с «Вылет» на «Вылет»:

if DateStart is not None:
      myfilter &= Q(departures__DepartingDate__gt=DateStart)

Я также изменил условие для вышеприведенного оператора if с

if DateStart in request.GET:

до

if DateStart is not None:

Приятно провести время!;)

...