В Django существует несколько способов создания фильтров, которые позволяют пользователю ограничивать результаты запроса на основе значений полей.
Первый и наиболее простой способ - использование метода filter()
внутри QuerySet
. Например, предположим у вас есть модель Product
со следующими полями: name
, price
и category
. Чтобы отфильтровать продукты по параметрам, можно написать следующий код:
from django.shortcuts import render from .models import Product def product_list(request): products = Product.objects.all() name = request.GET.get('name') min_price = request.GET.get('min_price') max_price = request.GET.get('max_price') category = request.GET.get('category') if name: products = products.filter(name__icontains=name) if min_price: products = products.filter(price__gte=min_price) if max_price: products = products.filter(price__lte=max_price) if category: products = products.filter(category=category) return render(request, 'product_list.html', {'products': products})
В этом коде мы получаем параметры GET-запроса, которые могут быть заданы в URL или форме на странице. Затем мы используем метод filter()
побитово для фильтрации products
в соответствии с введенными значениями. Затем передаем отфильтрованные объекты в шаблон product_list.html
для отображения.
Второй способ - использование модуля django-filter
, который предлагает более гибкое и мощное решение для создания фильтров. Чтобы использовать этот модуль, сначала необходимо его установить с помощью команды:
pip install django-filter
Затем вам нужно создать фильтр, который будет определять фильтрацию, а также создать представление, которое будет использовать этот фильтр. Например:
from django.shortcuts import render from django_filters import FilterSet from .models import Product class ProductFilter(FilterSet): class Meta: model = Product fields = ['name', 'price', 'category'] def product_list(request): filter = ProductFilter(request.GET, queryset=Product.objects.all()) return render(request, 'product_list.html', {'filter': filter})
В этом примере мы создаем класс ProductFilter
, наследующийся от FilterSet
. Внутри него мы определяем модель Product
и указываем, какие поля должны быть доступны для фильтрации. Затем, в представлении product_list
, мы создаем экземпляр ProductFilter
, передавая параметры GET-запроса и набор объектов Product
. Затем мы передаем фильтр в шаблон product_list.html
для отображения.
В шаблоне product_list.html
вы можете отображать отфильтрованные объекты, используя filter.qs
, например:
{% for product in filter.qs %} {{ product.name }} {{ product.price }} {{ product.category }} <!-- остальной код --> {% endfor %}
В обоих случаях вы можете настроить фильтры и расширить их функциональность, включая сортировку и дополнительные критерии фильтрации.