feat: Добавлена фильтрация заказов с django-filter и календарный компонент

Основные изменения:
- Установлен и настроен django-filter==24.3
- Создан OrderFilter с фильтрами по дате доставки, статусу, типу, оплате и поиску
- Реализован переиспользуемый компонент календарного фильтра date_range_filter.html
- Добавлены быстрые кнопки выбора дат (Сегодня, Завтра, Неделя)
- Создан templatetag param_replace для сохранения фильтров при пагинации
- Обновлен order_list view для использования django-filter
- Полностью переработан шаблон order_list.html с интеграцией фильтров
- Добавлены стили (date_filter.css) и логика (date_filter.js) для календаря

Структура новых файлов:
- orders/filters.py - FilterSet для заказов
- orders/templatetags/filter_tags.py - кастомные теги для фильтров
- orders/templates/orders/components/date_range_filter.html - компонент календаря
- orders/static/orders/css/date_filter.css - стили
- orders/static/orders/js/date_filter.js - JavaScript логика
- requirements.txt - зависимости проекта

Преимущества:
- Чистая архитектура фильтрации
- Автоматическое сохранение параметров при навигации
- Переиспользуемый календарный компонент
- Улучшенный UX с быстрыми фильтрами
- Готовность к масштабированию на другие модели

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-07 18:22:57 +03:00
parent ec0557c8cf
commit d37a5df482
11 changed files with 576 additions and 59 deletions

View File

@@ -2,50 +2,35 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.core.paginator import Paginator
from django.db.models import Q
from .models import Order, OrderItem
from .forms import OrderForm, OrderItemFormSet
from .filters import OrderFilter
def order_list(request):
"""Список всех заказов с фильтрацией и поиском"""
orders = Order.objects.select_related('customer', 'delivery_address', 'pickup_shop').all()
"""
Список всех заказов с фильтрацией и поиском
Использует django-filter для фильтрации данных
"""
# Базовый queryset с оптимизацией запросов
orders = Order.objects.select_related(
'customer', 'delivery_address', 'pickup_shop'
).all()
# Поиск
search_query = request.GET.get('search', '')
if search_query:
orders = orders.filter(
Q(order_number__icontains=search_query) |
Q(customer__name__icontains=search_query) |
Q(customer__phone__icontains=search_query) |
Q(customer__email__icontains=search_query)
)
# Фильтр по статусу
status_filter = request.GET.get('status', '')
if status_filter:
orders = orders.filter(status=status_filter)
# Фильтр по типу доставки
delivery_filter = request.GET.get('delivery_type', '')
if delivery_filter == 'delivery':
orders = orders.filter(is_delivery=True)
elif delivery_filter == 'pickup':
orders = orders.filter(is_delivery=False)
# Применяем фильтры через django-filter
order_filter = OrderFilter(request.GET, queryset=orders)
# Сортировка
orders = orders.order_by('-created_at')
filtered_orders = order_filter.qs.order_by('-created_at')
# Пагинация
paginator = Paginator(orders, 25)
paginator = Paginator(filtered_orders, 25)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
context = {
'filter': order_filter,
'page_obj': page_obj,
'search_query': search_query,
'status_filter': status_filter,
'delivery_filter': delivery_filter,
'status_choices': Order.STATUS_CHOICES,
}