From 000b791702255c0ff3ab425ab4d06c956efd579e Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 10 Nov 2025 22:24:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BF=D0=BE=20=D1=82=D0=B5=D0=BB=D0=B5=D1=84?= =?UTF-8?q?=D0=BE=D0=BD=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправления: - Поиск по телефону теперь работает независимо от формата ввода (иконки, пробелы, +/-) - Добавлена поддержка поиска по цифрам телефона (например, введение '291234' найдет +375291234567) - Оптимизирована задержка AJAX запроса (300ms вместо 250ms) - Добавлена обработка ошибок AJAX с логированием - Улучшена обработка пустых результатов 🤖 Generated with Claude Code Co-Authored-By: Claude --- myproject/customers/views.py | 29 +++++++++++++++---- .../orders/templates/orders/order_form.html | 24 +++++++++++---- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/myproject/customers/views.py b/myproject/customers/views.py index c9db9e3..ab937a5 100644 --- a/myproject/customers/views.py +++ b/myproject/customers/views.py @@ -148,12 +148,31 @@ def api_search_customers(request): # Пытаемся нормализовать номер телефона для поиска phone_normalized = normalize_query_phone(query) + # Для поиска по телефону: извлекаем только цифры и ищем по ним + # Это позволит найти клиента независимо от формата ввода + query_digits = ''.join(c for c in query if c.isdigit()) + # Ищем по имени, email или телефону - customers = Customer.objects.filter( - Q(name__icontains=query) | - Q(email__icontains=query) | - Q(phone__icontains=phone_normalized) - ).order_by('name')[:20] # Ограничиваем 20 результатами + # Используем Q-объекты для OR условий + q_objects = Q(name__icontains=query) | Q(email__icontains=query) + + # Для телефона ищем по нормализованному номеру и по цифрам + if phone_normalized: + q_objects |= Q(phone__icontains=phone_normalized) + + if query_digits: + # Ищем клиентов, чьи телефоны содержат введенные цифры + customers_by_phone = Customer.objects.filter(phone__isnull=False) + matching_by_digits = [] + for customer in customers_by_phone: + customer_digits = ''.join(c for c in str(customer.phone) if c.isdigit()) + if query_digits in customer_digits: + matching_by_digits.append(customer.pk) + + if matching_by_digits: + q_objects |= Q(pk__in=matching_by_digits) + + customers = Customer.objects.filter(q_objects).distinct().order_by('name')[:20] results = [] diff --git a/myproject/orders/templates/orders/order_form.html b/myproject/orders/templates/orders/order_form.html index 38cbb18..b37e51f 100644 --- a/myproject/orders/templates/orders/order_form.html +++ b/myproject/orders/templates/orders/order_form.html @@ -406,29 +406,41 @@ document.addEventListener('DOMContentLoaded', function() { language: 'ru', placeholder: 'Начните вводить имя, телефон или email', minimumInputLength: 1, + allowClear: true, ajax: { url: '{% url "customers:api-search-customers" %}', dataType: 'json', - delay: 250, + delay: 300, + quietMillis: 250, data: function(params) { return { - q: params.term, + q: params.term || '', page: params.page || 1 }; }, processResults: function(data) { return { - results: data.results, + results: data.results || [], pagination: { - more: data.pagination.more + more: data.pagination ? data.pagination.more : false } }; }, - cache: true + cache: true, + error: function() { + console.log('Ошибка при поиске клиента'); + } }, templateResult: formatCustomerOption, templateSelection: formatCustomerSelection, - escapeMarkup: function(markup) { return markup; } + escapeMarkup: function(markup) { return markup; }, + matcher: function(params, data) { + // Позволяем все результаты, фильтрация на сервере + if ($.trim(params.term) === '') { + return null; + } + return data; + } }); // Форматирование опции в списке