Интернет-магазин на фреймворке Django. Часть 4.

Оформление заказа

После создания корзины, которая показывала, какие товары мы добавили, их цену и их количество, я приступил к реализации страницы оформления заказа, на которую мы уже переходили при нажатии на кнопку "Оформить заказ", расположенную в самой корзине. Как создавать страницу, я уже рассказывал в одной из предыдущих частей, на примере создания страницы товара и витрины. После того, как я создал страницу, там в ход пошла уже обычная верстка, а далее, я уже начал делать вывод товаров из корзины на нашу созданную страницу в виде таблицы. Для этого, в файле views.py я написал код, который у меня доставал все записи из модели "ProductInBasket", которая хранит все данные о товарах в корзине. Сама модель расположена в models.py. Также в файле checkout.html я сделал отрисовку полученных данных на самой странице. Но кроме вывода товаров из корзины, в данном файле была прописана также логика работы страницы, которая позволяла изменять количество товаров, считала стоимость по каждому товару и считала уже итоговую стоимость всего заказа в целом. Помимо этого, если у покупателя нету товаров в корзине, то при переходе на страницу, ему пишет "в корзине нет товаров".

Но это была проделана только половина работы. Основным этапом в данной части является написание back-end части, а именно, необходимо было, чтобы в Django-Admin Panel передавалась вся информация о заказчике, а также информация о самом заказе. И в ходе этой работы, была создана и мигрирована таблица в базу данных (как это делается я уже рассказывал в одной из части), куда, при нажатии на кнопку "Заказать", отправлялась вся информация о заказе и покупателе, а также дата его создания. Результат и сами коды, представлены ниже.

views.py

def checkout(request):
    session_key = request.session.session_key
    products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True)
    print (products_in_basket)
    for item in products_in_basket:
        print(item)


    form = CheckoutContactForm(request.POST or None)
    if request.POST:
        print(request.POST)
        if form.is_valid():
            print("yes")
            data = request.POST
            name = data.get("name", "3423453")
            phone = data["phone"]
            address = data["address"]
            email = data["email"]
            user, created = User.objects.get_or_create(username=phone, defaults={"first_name": name})

            order = Order.objects.create(user=user, customer_name=name, customer_phone=phone,customer_address=address,customer_email=email)

            for name, value in data.items():
                if name.startswith("product_in_basket_"):
                    product_in_basket_id = name.split("product_in_basket_")[1]
                    product_in_basket = ProductInBasket.objects.get(id=product_in_basket_id)
                    print(type(value))

                    product_in_basket.nmb = value
                    product_in_basket.order = order
                    product_in_basket.save(force_update=True)

                    ProductInOrder.objects.create(product=product_in_basket.product, nmb = product_in_basket.nmb,
                                                  price_per_item=product_in_basket.price_per_item,
                                                  total_price = product_in_basket.total_price,
                                                  order=order)

            return HttpResponseRedirect(request.META['HTTP_REFERER'])
        else:
            print("no")
    return render(request, 'web/checkout.html', locals())

forms.py

class CheckoutContactForm(forms.Form):
    name = forms.CharField(required=True)
    phone = forms.CharField(required=True)
    address = forms.CharField(required=True)
    email = forms.CharField(required=True)

checkout.html



Результат по checkout.html

Результат в Django-Admin Panel


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *