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

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

### 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,6 +1,6 @@
from django.contrib import admin
from django.db import models
from .models import Customer, Address
from .models import Customer
class IsVipFilter(admin.SimpleListFilter):
@@ -21,14 +21,6 @@ class IsVipFilter(admin.SimpleListFilter):
return queryset
class AddressInline(admin.TabularInline):
"""Inline для управления адресами клиента в интерфейсе администратора"""
model = Address
extra = 1
verbose_name = "Адрес доставки"
verbose_name_plural = "Адреса доставки"
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
"""Административный интерфейс для управления клиентами цветочного магазина"""
@@ -69,55 +61,3 @@ class CustomerAdmin(admin.ModelAdmin):
'classes': ('collapse',)
}),
)
inlines = [AddressInline]
@admin.register(Address)
class AddressAdmin(admin.ModelAdmin):
"""Административный интерфейс для управления адресами доставки"""
list_display = (
'recipient_name',
'recipient_phone',
'full_address',
'customer',
'district',
'confirm_address_with_recipient',
'is_default'
)
list_filter = (
'is_default',
'confirm_address_with_recipient',
'district',
'created_at'
)
search_fields = (
'recipient_name',
'street',
'building_number',
'customer__name',
'customer__email'
)
ordering = ('-is_default', '-created_at')
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Информация о получателе', {
'fields': ('customer', 'recipient_name', 'recipient_phone')
}),
('Адрес доставки', {
'fields': ('street', 'building_number', 'apartment_number', 'district')
}),
('Дополнительная информация', {
'fields': ('delivery_instructions', 'confirm_address_with_recipient'),
'classes': ('collapse',)
}),
('Статус', {
'fields': ('is_default',),
'classes': ('collapse',)
}),
('Даты', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.0.10 on 2025-11-10 23:09
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('customers', '0001_initial'),
('orders', '0003_remove_address_model'),
]
operations = [
migrations.DeleteModel(
name='Address',
),
]

View File

@@ -193,109 +193,3 @@ class Customer(models.Model):
"""Увеличивает общую сумму покупок"""
self.total_spent = self.total_spent + amount
self.save(update_fields=['total_spent'])
class Address(models.Model):
"""
Модель адреса доставки для клиентов цветочного магазина в Минске.
Клиент может иметь несколько адресов для разных получателей.
"""
customer = models.ForeignKey(
Customer,
on_delete=models.CASCADE,
related_name='addresses',
verbose_name="Клиент"
)
# Address information for delivery in Minsk
recipient_name = models.CharField(
max_length=200,
verbose_name="Имя получателя",
help_text="Имя человека, которому будет доставлен заказ"
)
recipient_phone = PhoneNumberField(
blank=True,
null=True,
verbose_name="Телефон получателя",
help_text="Контактный телефон получателя для уточнения адреса"
)
street = models.CharField(
max_length=255,
verbose_name="Улица"
)
building_number = models.CharField(
max_length=20,
verbose_name="Номер здания"
)
apartment_number = models.CharField(
max_length=20,
blank=True,
null=True,
verbose_name="Номер квартиры/офиса"
)
district = models.CharField(
max_length=100,
blank=True,
null=True,
verbose_name="Район",
help_text="Район в Минске для удобства доставки"
)
# Additional information for delivery
delivery_instructions = models.TextField(
blank=True,
null=True,
verbose_name="Инструкции для доставки",
help_text="Дополнительные инструкции для курьера (домофон, подъезд и т.д.)"
)
confirm_address_with_recipient = models.BooleanField(
default=False,
verbose_name="Уточнить адрес у получателя",
help_text="Курьер должен уточнить адрес у получателя перед доставкой"
)
is_default = models.BooleanField(
default=False,
verbose_name="Адрес по умолчанию",
help_text="Использовать этот адрес для доставки по умолчанию"
)
# Timestamps
created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
updated_at = models.DateTimeField(auto_now=True, verbose_name="Дата обновления")
class Meta:
verbose_name = "Адрес доставки"
verbose_name_plural = "Адреса доставки"
indexes = [
models.Index(fields=['customer']),
models.Index(fields=['is_default']),
models.Index(fields=['district']),
]
ordering = ['-is_default', '-created_at']
def save(self, *args, **kwargs):
if self.is_default:
# Если этот адрес устанавливается как адрес по умолчанию, снимаем флаг по умолчанию с других адресов этого клиента
Address.objects.filter(customer=self.customer, is_default=True).update(is_default=False)
super().save(*args, **kwargs)
def __str__(self):
address_line = f"{self.street}, {self.building_number}"
if self.apartment_number:
address_line += f", кв/офис {self.apartment_number}"
return f"{self.recipient_name} - {address_line}, {self.customer.full_name}"
@property
def full_address(self):
"""Полный адрес для доставки"""
address = f"{self.street}, {self.building_number}"
if self.apartment_number:
address += f", кв/офис {self.apartment_number}"
return address

View File

@@ -8,7 +8,7 @@ from django.views.decorators.http import require_http_methods
from django.contrib.auth.decorators import login_required
import phonenumbers
import json
from .models import Customer, Address
from .models import Customer
from .forms import CustomerForm