Как сделать раздел поиска в html и вид поиска в django с несколькими запросами - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь сделать веб-страницу о продаже автомобилей (в образовательных целях), и я узнал, как сделать поиск, но я хочу, чтобы он выглядел лучше, как на многих страницах по продаже автомобилей с разделом, в котором можно выбирать категории автомобилей. тип топлива, поврежденный или нет и т. д. мой поиск сейчас выглядит так:

    def search(request):
        if 'search_filter' in request.GET:
            search_filter = request.GET['search_filter']
            cars = [{
                'id': x.id,
                'driven': x.driven,
                'description': x.description,
                'price': x.price,
                'firstImage': x.carimage_set.first().image
            } for x in Car.objects.filter(description__icontains=search_filter)
            ]
            return JsonResponse({'data': cars})
        context = {'cars': Car.objects.all().order_by('price')}
        return render(request, 'cars/car_index.html', context)

Теперь этот поиск выполните, если он найдет в описании то, что я ищу. Моя цель - сделать так, чтобы пользователь мог вводить значения, которые нужно искать, в поле ввода, такие как тип автомобиля, марка автомобиля, год и т. Д.

<!DOCTYPE html>
<html>
<body>
<form action="">
<select name="cars">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="fiat">Fiat</option>
  <option value="audi">Audi</option>
</select>

    <legend>Additional Info:</legend>
    Car Type:<br>
    <input type="text" name="car_type">
    <br>
    Car Make:<br>
    <input type="text" name="car_make">
    <br><br>
    <input type="submit" value="Search">
</form>
</body>
</html>

Это очень примитивная форма, но это мое представление о том, как я пытаюсь заставить ее выглядеть.

1 Ответ

1 голос
/ 08 мая 2019

Вы можете использовать Q объектов .

Использовать скрытое поле, чтобы вы знали, когда выполнять поиск.

<!DOCTYPE html>
<html>
<body>
<form method="get">
<select name="cars">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="fiat">Fiat</option>
  <option value="audi">Audi</option>
</select>

    <legend>Additional Info:</legend>
    Car Type:<br>
    <input type="text" name="car_type">
    <br>
    Car Make:<br>
    <input type="text" name="car_make">
    <br><br>
    <input type="hidden" name="search_filter" value="true">
    <input type="submit" value="Search">
</form>
</body>
</html>

Ваше мнение будет примерно таким:

import operator

def search(request):
        if 'search_filter' in request.GET:  # set a hidden field (search_filter) so you know that you need to perform a search
            search_params = request.GET.dict()
            search_params.pop("search_filter")
            # for all search params which are not null, create a Q object
            # assuming that you provide the column name as search criteria.
            q_list = [Q(("{}__icontains".format(param), search_params[param])) for param in search_params if search_params[param] is not None]  

            queryset = Car.objects.filter(reduce(operator.and_, q_list))  # combine Q object using & operation
            cars = [{
                'id': x.id,
                'driven': x.driven,
                'description': x.description,
                'price': x.price,
                'firstImage': x.carimage_set.first().image
            } for x in queryset
            ]
            return JsonResponse({'data': cars})
        context = {'cars': Car.objects.all().order_by('price')}
        return render(request, 'cars/car_index.html', context)

Для дополнительных параметров и управления фильтрами вы можете использовать django-filters

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...