Итак, мы добавили товары в корзину (да, пока все делается "на коленке" и подразумевается что мы авторизированы на сайте), переходим в нее и начинаем процедуру оформления заказа. Нажимаем кнопку "Оформить заказ"
и... ничего! Само собой ничего, ведь ни эндпойнта /api/orders
Ни моделей, ни представления пока не существует. Исправим это! Начнем с модели заказа. А для этого посмотрим, что нам предлагается сделать по swagger'у, для получения GET:
Я было попробовал создать метод get и вписать туда предполагаемые данные и нажал на кнопку "оформить заказ", на что мне выдало ответ что данный метод не поддерживается, следовательно, здесь работает только POST.
Я открыл swagger метода POST:
При нажатии на кнопку "оформить заказ" передается список словарей, наполненных информацией о товаре. Если выполнить команду:
print(respose.data) то нам как раз выведет весь этот список:
Вся эта и еще кое какая информация должна будет обработана в методе POST, создать заказ и вернуть id созданного заказа:
Итак, есть входящая информация, нужно добиться исходящей...
Подумаем изходя из этой информации - что же будет входить в модель Order?
Как видим, начиная с products, это всё что относится к свойствам продукта, поле email и phone мы возьмем из профиля пользователя. id - автоматическое поле. В итоге остается не так много полей: когда создан заказ, имя заказа (хотя...), тип доставки (платно - бесплатно), как оплачено (карта или онлайн), общая сумма заказа, статус (одобрено или нет), город и адрес. Ну и поехали реализовывать модель заказа:
Не знаю насколько это верная модель "Заказа" но при оформлении ее в админ-панели, при создании нового заказа, она даёт вот такую форму регистрации заказа. И при заполнении всех полей создаёт в БД заказ. Вроде бы работает. Но посмотрим на практике чего я упустил или наоборот сделал лишнего.
Выделенные поля прописаны в модели как константы DELIVERY_OPTIONS и PAYMENT_OPTIONS:
Заодно я прописал отдельной моделью "стоимость доставки", ибо со временем она может меняться и чтобы была возможность её из "админки" поправить так, как это будет угодно владельцу магазина.
Вот вроде бы нужные модели готовы, надо реализовывать представления для обработки нажатия на кнопку "Оформить заказ", как я и писал выше - это будет метод POST.
Я сразу же начал с методов try - except, дабы проверить что у того пользователя под которым выполняется оформление заказа была уже создана "корзина". И первой же строчкой пытаюсь присвоить переменной объект корзины данного пользователя, если это не получится то программа дальше выполняться не будет и сразу вылетит ошибка.
Не вижу смысла дальше детально описывать шаги по созданию заказа, я просто выведу этот код, а кому требуется разъяснение - пишите в комменты я поясню.
Да, как подключить этот класс в файле urls.py, тоже думаю писать не надо... Ну или - в комменты!
После нажатия на кнопку "Оформить заказ" создается заказ и возвращается номер этого заказа, ну а мы же переходим на страницу продолжения оформления этого заказа:
Теперь нам нужно получить из профиля пользователя "ФИО", "Телефон", "Email" и вставить их на странице оформления заказа, а если их в профиле ещё нет - вписать в ручную и обновить профиль пользователя.
Это уже работает на другом эндпойнте:
Где get загружает данные из профиля в форму, а post посылает отредактированные данные пользователя из формы для записи в базу данных. И я думаю первым нужно сделать загрузку из профиля данных если они есть. Создаем новый класс и в нем метод get (и подключим его в urls.py). Я обычно делаю пустой класс с пустыми методами (если их не один) и потихоньку наполняю его строками. Что-то типа этого:
Подключение...
Это минимально рабочий код для проверки методов get и post, и заставит кнопку "Дальше" работать (хотя она наверное и без кода работает)...
Всё правильно, метод пост вызывается уже в самом конце оформления заказа при нажатии на кнопку "Оплатить"
Все четыре шага - это сбор и редактирование информации в форме. Ну а теперь о коде. Я сначала метод get сделал прям тут во views.py но посмотрел и мне не понравилось - дай думаю перенесу это все дело в отдельный сериализатор, а то слишком много ненужного прибивается вместе нужными полями. и вот что из этого получилось:
Сериализатор
И при заполнении всех полей получил вот такую вот итоговую красоту:
Ну вот, теперь дело за обработкой метода post, нажмём кнопку оплатить и что из этого получится?!
Так как в методе-заглушке retrun Response(status=200) то и все прошло успешно и программа перешла к следующему эндпойнту о котором я буду писать уже в следующей статье. Этот эндпойнт у меня не написан.
Но принт, вывел то что посылается в request:
Это все параметры нашего заказа.
Только сейчас понял, что не все поля в сериализаторе реализовал, оказывается еще осталось чуть чуть...
Ну теперь всё? переходим к POST! Здесь все просто, сохраняем из полученных форм и чекбоксов данные и их сохраняем в order. И как итог возвращаем id нашего заказа.
И наша программа переходит к сервису оплаты: