Для создания фильтра списка на Django вам потребуется использовать модуль QuerySet, который предоставляет широкий функционал для фильтрации данных в базе данных.
В Django можно фильтровать элементы списка с помощью метода filter(), который можно вызвать на объекте QuerySet. Метод filter() позволяет указать условия фильтрации с использованием аргументов, передаваемых в виде именованных параметров. Например:
from django.shortcuts import render from .models import Item def item_list(request): query = request.GET.get('query') # Получаем значение параметра "query" из URL-строки queryset = Item.objects.all() # Получаем все элементы из базы данных if query: queryset = queryset.filter(name__icontains=query) # Фильтруем элементы по имени с учетом регистра context = {'queryset': queryset} return render(request, 'item_list.html', context)
В приведенном примере мы получаем значение параметра "query" из URL-строки, а затем проверяем, было ли передано значение параметра. Если значение параметра существует, то мы фильтруем элементы по имени с помощью метода filter() и оператора "__icontains", который ищет частичное совпадение по имени (без учета регистра).
Далее, мы передаем отфильтрованный queryset в контекст шаблона и рендерим его на странице item_list.html.
Для настройки фильтра вам также понадобится настроить URL-маршрут и форму для передачи параметра "query". В файле urls.py вашего приложения добавьте следующий код:
from django.urls import path from . import views urlpatterns = [ path('item_list/', views.item_list, name='item_list'), ]
Теперь вы можете создать шаблон item_list.html для отображения отфильтрованного списка элементов, например:
<!-- item_list.html --> {% for item in queryset %} <p>{{ item.name }}</p> {% empty %} <p>No items found</p> {% endfor %}
Это основная структура, но вы можете добавить дополнительные фильтры, такие как фильтрация по дате, числовым значениям и т.д., используя операторы в методе filter(). Более подробную информацию о доступных операторах и способах фильтрации можно найти в документации Django.