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:
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user