Исправлена отображение полей адреса и стили формы заказа

## Основные изменения:

### 1. Исправлена логика выбора режима адреса
- Переместил функцию initAddressModeToggle() из jQuery блока в отдельную функцию
- Теперь инициализация адреса работает независимо от jQuery
- Добавлены подробные логи в консоль для отладки ([ADDRESS MODE] префикс)

### 2. Добавлены CSS классы для управления видимостью
- address-history-mode: display: none !important (по умолчанию скрыт)
- address-new-mode: display: none !important (по умолчанию скрыт)
- .visible класс переводит элементы на display: block !important
- Использование classList.add/remove вместо inline styles

### 3. Исправлены стили полей формы (OrderForm)
- Добавлена явная обработка для Select полей - получают form-select
- Поле "Статус" и другие Select теперь имеют правильные стили Bootstrap
- Разделена логика для RadioSelect, Select и остальных полей

### 4. Улучшена отладка
- Добавлены console.log сообщения на каждом этапе инициализации
- Префикс [ADDRESS MODE] помогает отличить логи системы адреса от других

## Технические детали:

- Address сервис использует метод format_address_for_display() для красивого вывода
- AJAX endpoint get_customer_address_history() загружает адреса клиента
- Три режима адреса: history (из истории), new (новый адрес), empty (без адреса)
- Режим empty выбирается по умолчанию

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-11 02:49:25 +03:00
parent 7d82d67b5f
commit ddbb4f963b
16 changed files with 956 additions and 188 deletions

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
from django import forms
from django.forms import inlineformset_factory
from .models import Order, OrderItem
from customers.models import Customer, Address
from .models import Order, OrderItem, Address
from customers.models import Customer
from shops.models import Shop
from products.models import Product, ProductKit
@@ -10,6 +10,82 @@ from products.models import Product, ProductKit
class OrderForm(forms.ModelForm):
"""Форма для создания и редактирования заказа"""
# Поля для ввода адреса
address_mode = forms.ChoiceField(
choices=[
('history', 'Выбрать из истории'),
('new', 'Ввести новый адрес'),
('empty', 'Без адреса (заполнить позже)'),
],
initial='empty',
widget=forms.RadioSelect(attrs={'class': 'form-check-input'}),
required=False,
label='Способ указания адреса'
)
# Выбор адреса из истории
address_from_history = forms.ModelChoiceField(
queryset=Address.objects.none(),
required=False,
widget=forms.Select(attrs={'class': 'form-select'}),
label='Адрес из истории'
)
# Поля для ввода нового адреса
address_street = forms.CharField(
max_length=255,
required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Улица'}),
label='Улица'
)
address_building_number = forms.CharField(
max_length=20,
required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Номер дома'}),
label='Номер дома'
)
address_apartment_number = forms.CharField(
max_length=20,
required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Квартира/офис'}),
label='Квартира/офис'
)
address_entrance = forms.CharField(
max_length=20,
required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Подъезд'}),
label='Подъезд'
)
address_floor = forms.CharField(
max_length=20,
required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Этаж'}),
label='Этаж'
)
address_intercom_code = forms.CharField(
max_length=100,
required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Код домофона'}),
label='Код домофона'
)
address_delivery_instructions = forms.CharField(
required=False,
widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 3, 'placeholder': 'Инструкции для курьера'}),
label='Инструкции для доставки'
)
address_confirm_with_recipient = forms.BooleanField(
required=False,
widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}),
label='Уточнить адрес у получателя'
)
class Meta:
model = Order
fields = [
@@ -46,7 +122,14 @@ class OrderForm(forms.ModelForm):
field.widget.attrs.update({'class': 'form-check-input'})
elif isinstance(field.widget, forms.Textarea):
field.widget.attrs.update({'class': 'form-control', 'rows': 3})
elif isinstance(field.widget, forms.RadioSelect):
# RadioSelect не нуждается в доп классах (уже есть form-check-input)
pass
elif isinstance(field.widget, forms.Select):
# Select поля получают form-select
field.widget.attrs.update({'class': 'form-select'})
else:
# Остальные поля (TextInput, NumberInput, etc)
field.widget.attrs.update({'class': 'form-control'})
# Select2 для поля customer с AJAX поиском (инициализируется отдельно в JS)
@@ -81,6 +164,18 @@ class OrderForm(forms.ModelForm):
self.fields['recipient_name'].required = False
self.fields['recipient_phone'].required = False
# Инициализируем queryset для address_from_history
# Это будет переопределено в представлении после выбора клиента
if self.instance.pk and self.instance.customer:
# При редактировании заказа загружаем историю адресов этого клиента
customer_orders = Order.objects.filter(
customer=self.instance.customer,
delivery_address__isnull=False
).order_by('-created_at')
self.fields['address_from_history'].queryset = Address.objects.filter(
order__in=customer_orders
).distinct().order_by('-created_at')
class OrderItemForm(forms.ModelForm):
"""Форма для позиции заказа"""