/
ALEXWORLD
/
LEX
Обзор
Документация
Войти
/
ALEXWORLD
/
LEX
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ordersapp/views.py
127 строк
4 KB
Roslyakov
init
11 апр 2025, 07:36
11 апр 2025, 07:36
9c1e6fe
Код
Авторство
О чём код?
from django.shortcuts import get_object_or_404 from django.shortcuts import HttpResponseRedirect from django.urls import reverse from django.urls import reverse_lazy from django.db import transaction from django.forms import inlineformset_factory from django.views.generic import ListView from django.views.generic import CreateView from django.views.generic import UpdateView from django.views.generic import DeleteView from django.views.generic.detail import DetailView from basketapp.models import Basket from ordersapp.models import Order from ordersapp.models import OrderItem from ordersapp.forms import OrderItemForm # список заказов class OrderList(ListView): model = Order def get_queryset(self): return Order.objects.filter(user=self.request.user) class OrderItemsCreate(CreateView): model = Order fields = [] success_url = reverse_lazy('ordersapp:orders_list') def get_context_data(self, **kwargs): data = super(OrderItemsCreate, self).get_context_data(**kwargs) OrderFormSet = inlineformset_factory( Order, OrderItem, form=OrderItemForm, extra=1, fields='__all__') if self.request.POST: formset = OrderFormSet(self.request.POST) else: basket_items = Basket.get_items(self.request.user) if len(basket_items): OrderFormSet = inlineformset_factory(Order,OrderItem, form=OrderItemForm, extra=len(basket_items), fields='__all__') formset = OrderFormSet() for num, form in enumerate(formset.forms): form.initial['accommodation'] = basket_items[num].accommodation form.initial['nights'] = basket_items[num].nights form.initial['price'] = basket_items[num].accommodation.price basket_items.delete() else: formset = OrderFormSet() data['orderitems'] = formset return data def form_valid(self, form): context = self.get_context_data() orderitems = context['orderitems'] with transaction.atomic(): form.instance.user = self.request.user self.object = form.save() if orderitems.is_valid(): orderitems.instance = self.object orderitems.save() if self.object.get_total_cost() == 0: self.object.delete() return super(OrderItemsCreate, self).form_valid(form) class OrderItemsUpdate(UpdateView): model = Order fields = [] success_url = reverse_lazy('ordersapp:orders_list') def get_context_data(self, **kwargs): data = super(OrderItemsUpdate, self).get_context_data(**kwargs) OrderFormSet = inlineformset_factory(Order, OrderItem, form=OrderItemForm, extra=1, fields='__all__') if self.request.POST: data['orderitems'] = OrderFormSet(self.request.POST, instance=self.object) else: formset = OrderFormSet(instance=self.object) for form in formset.forms: if form.instance.pk: form.initial['price'] = form.instance.accommodation.price data['orderitems'] = formset return data def form_valid(self, form): context = self.get_context_data() orderitems = context['orderitems'] with transaction.atomic(): form.instance.user = self.request.user self.object = form.save() if orderitems.is_valid(): orderitems.instance = self.object orderitems.save() if self.object.get_total_cost() == 0: self.object.delete() return super(OrderItemsUpdate, self).form_valid(form) class OrderRead(DetailView): model = Order def get_context_data(self, **kwargs): context = super(OrderRead, self).get_context_data(**kwargs) context['title'] = 'заказ/просмотр' return context class OrderDelete(DeleteView): model = Order success_url = reverse_lazy('ordersapp:orders_list') def order_forming_complete(request, pk): order = get_object_or_404(Order, pk=pk) order.status = Order.SENT_TO_PROCEED order.save() return HttpResponseRedirect(reverse('ordersapp:orders_list'))