Исправлена отображение полей адреса и стили формы заказа
## Основные изменения: ### 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:
@@ -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):
|
||||
"""Форма для позиции заказа"""
|
||||
|
||||
Reference in New Issue
Block a user