В этой статье мы разберем, как создать функциональный фильтр записей в веб-приложении на основе Django. Фильтрация данных — это одна из ключевых функций современных веб-приложений, которая позволяет пользователям быстро находить нужную информацию. Мы рассмотрим пошаговый процесс: от настройки моделей и представлений до создания удобного интерфейса с использованием HTML и CSS. Эта статья подойдет как новичкам, так и опытным разработчикам, желающим углубить свои знания.
Шаг 1: Подготовка проекта и модели
Прежде чем приступить к созданию фильтра, убедитесь, что у вас есть базовый проект Django. Если его нет, создайте новый проект и приложение с помощью следующих команд:
django-admin startproject myproject
cd myproject
python manage.py startapp blog
Добавьте приложение blog
в список INSTALLED_APPS
в файле settings.py
. Теперь создадим модель для записей. Например, это может быть блог с постами. Откройте файл blog/models.py
и добавьте следующее:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200, verbose_name="Заголовок")
content = models.TextField(verbose_name="Содержание")
category = models.CharField(max_length=100, verbose_name="Категория")
created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
is_published = models.BooleanField(default=True, verbose_name="Опубликовано")
def __str__(self):
return self.title
class Meta:
verbose_name = "Пост"
verbose_name_plural = "Посты"
После этого выполните команды для создания и применения миграций:
python manage.py makemigrations
python manage.py migrate
Модель готова! Теперь у нас есть структура данных, с которой мы будем работать.
Шаг 2: Настройка фильтра с использованием Django Filters
Для реализации фильтрации удобно использовать библиотеку django-filter
. Установите ее с помощью pip:
pip install django-filter
Добавьте django_filters
в INSTALLED_APPS
в settings.py
:
INSTALLED_APPS = [
...
'django_filters',
'blog',
]
Создайте файл filters.py
в папке приложения blog
и добавьте следующий код:
import django_filters
from .models import Post
class PostFilter(django_filters.FilterSet):
title = django_filters.CharFilter(lookup_expr='icontains', label="Поиск по заголовку")
category = django_filters.CharFilter(lookup_expr='exact', label="Категория")
is_published = django_filters.BooleanFilter(label="Опубликовано")
class Meta:
model = Post
fields = ['title', 'category', 'is_published']
Этот код создает фильтр, который позволяет искать посты по заголовку (с учетом регистра), категории и статусу публикации.
Шаг 3: Создание представлений
Теперь настроим представление для отображения списка постов с фильтром. Откройте blog/views.py
и добавьте:
from django.shortcuts import render
from .models import Post
from .filters import PostFilter
def post_list(request):
posts = Post.objects.all()
filter = PostFilter(request.GET, queryset=posts)
posts = filter.qs
return render(request, 'blog/post_list.html', {'posts': posts, 'filter': filter})
Здесь мы передаем в шаблон как отфильтрованные посты (posts
), так и сам объект фильтра (filter
), чтобы использовать его в HTML.
Шаг 4: Настройка шаблона
Создайте папку templates/blog
в вашем приложении и файл post_list.html
. Добавьте в него следующее:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Список постов</title>
<style>
.filter-form { margin-bottom: 20px; }
.post-list { list-style-type: none; }
.post-item { padding: 10px; border-bottom: 1px solid #ccc; }
</style>
</head>
<body>
<h1>Список постов</h1>
<div class="filter-form">
<form method="get">
{{ filter.form.as_p }}
<button type="submit">Фильтровать</button>
</form>
</div>
<ul class="post-list">
{% for post in posts %}
<li class="post-item">
<h2>{{ post.title }}</h2>
<p>{{ post.content|truncatewords:20 }}</p>
<p>Категория: {{ post.category }} | Дата: {{ post.created_at }}</p>
</li>
{% empty %}
<li>Постов не найдено.</li>
{% endfor %}
</ul>
</body>
</html>
Этот шаблон включает форму фильтра и список постов. Поле {{ filter.form.as_p }}
автоматически генерирует HTML для полей фильтра из PostFilter
.
Шаг 5: Настройка URL
Добавьте маршрут в urls.py
приложения blog
. Если файла еще нет, создайте его:
from django.urls import path
from .views import post_list
urlpatterns = [
path('', post_list, name='post_list'),
]
Подключите его в главном urls.py
проекта:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
Шаг 6: Тестирование и улучшение
Запустите сервер разработки:
python manage.py runserver
Перейдите по адресу http://127.0.0.1:8000/
и протестируйте фильтр. Вы можете искать посты по заголовку, фильтровать по категории и статусу публикации.
Для улучшения интерфейса добавьте стили через CSS или подключите библиотеку вроде Bootstrap. Также можно расширить фильтр, добавив, например, диапазон дат:
class PostFilter(django_filters.FilterSet):
created_at = django_filters.DateFromToRangeFilter(label="Диапазон дат")
...
Это позволит пользователям выбирать посты за определенный период.
Заключение
Мы создали полноценный фильтр записей в Django, который легко настроить и расширить под любые нужды. Использование django-filter
упрощает работу с фильтрацией, а комбинация с HTML и CSS делает интерфейс удобным для пользователей. Попробуйте добавить свои поля в модель и фильтр, чтобы адаптировать решение под ваш проект!
Написать комментарий