Как сделать фильтры из полей на сайте Django?

В 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 %}

В обоих случаях вы можете настроить фильтры и расширить их функциональность, включая сортировку и дополнительные критерии фильтрации.