ПРОБЛЕМА: Использование PaymentFormSet для платежей было НЕПРАВИЛЬНЫМ подходом: 1. Платежи = финансовые транзакции (не должны редактироваться inline) 2. Формы валидировали существующие платежи как новые 3. Сложная логика с formset management forms 4. Конфликты валидации кошелька РЕШЕНИЕ (Django Best Practices): Разделили управление платежами на отдельные операции: АРХИТЕКТУРА: ` POST /orders/111/payments/add/ # Добавить платеж POST /orders/111/payments/123/delete/ # Удалить платеж ` ПРЕИМУЩЕСТВА: ✅ Чистая архитектура (separation of concerns) ✅ Платежи = неизменяемые транзакции ✅ Простая валидация (только для новых) ✅ Легко тестировать ✅ API-ready структура ИЗМЕНЕНИЯ: 1. orders/views.py: - Убран PaymentFormSet из order_create и order_update - Добавлен payment_add(request, order_number) - Добавлен payment_delete(request, order_number, payment_id) - Используется простой PaymentForm вместо formset - Payment.save() автоматически обрабатывает: * Списание из кошелька * Обработку переплаты * Обновление amount_paid 2. orders/urls.py: - Добавлены URL patterns для payment-add и payment-delete - Структура: /orders/<number>/payments/add|<id>/delete/ 3. orders/templates/orders/order_form.html: - Убран PaymentFormSet и все его скрипты (~265 строк) - Простая HTML форма для добавления платежа - Существующие платежи: read-only список с кнопками удаления - Каждое удаление = отдельный POST запрос - Для создания: показываем предупреждение вместо формы 4. orders/templatetags/orders_tags.py (NEW): - Template tag get_payment_methods - Загружает активные способы оплаты - Использование: {% get_payment_methods as payment_methods %} РЕЗУЛЬТАТ: - Код: -191 строка - Логика: простая и понятная - Архитектура: правильная (как в учебнике) - Платежи: только add/delete (без edit) - Валидация: работает корректно - UX: чище и понятнее
33 lines
1.4 KiB
Python
33 lines
1.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
from django.urls import path
|
|
from . import views
|
|
|
|
app_name = 'orders'
|
|
|
|
urlpatterns = [
|
|
path('', views.order_list, name='order-list'),
|
|
path('create/', views.order_create, name='order-create'),
|
|
path('<int:order_number>/', views.order_detail, name='order-detail'),
|
|
path('<int:order_number>/edit/', views.order_update, name='order-update'),
|
|
path('<int:order_number>/delete/', views.order_delete, name='order-delete'),
|
|
|
|
# Payment Management
|
|
path('<int:order_number>/payments/add/', views.payment_add, name='payment-add'),
|
|
path('<int:order_number>/payments/<int:payment_id>/delete/', views.payment_delete, name='payment-delete'),
|
|
|
|
# AJAX endpoints
|
|
path('api/customer-address-history/', views.get_customer_address_history, name='api-customer-address-history'),
|
|
|
|
# Wallet payment
|
|
path('<int:order_number>/apply-wallet/', views.apply_wallet_payment, name='apply-wallet'),
|
|
|
|
# AJAX status update
|
|
path('api/<int:order_number>/set-status/', views.set_order_status, name='api-set-order-status'),
|
|
|
|
# Order Status Management URLs
|
|
path('statuses/', views.order_status_list, name='status_list'),
|
|
path('statuses/create/', views.order_status_create, name='status_create'),
|
|
path('statuses/<int:pk>/edit/', views.order_status_update, name='status_edit'),
|
|
path('statuses/<int:pk>/delete/', views.order_status_delete, name='status_delete'),
|
|
]
|