Создание корзины
Я уже говорил во второй части, что на странице товаров я создал кнопку покупки и поле для добавления количество товаров, поэтому этот момент в этом разделе опускаем. Сама корзина реализована с помощью jQuery. Что такое вообще jQuery? jQuery — набор функций JavaScript, фокусирующийся на взаимодействии JavaScript и HTML. Первым делом, мы подключаем jQuery к нашему проекту путем написания команды в static (в моем случае это файл main.html, в который мы подключали все файлы в первой части, а именно: Js,css и так далее). После этого, в папке js мы создаем файл scripts.js. В данном файле был прописан код, который позволяет добавлять и удалять товар из корзины. Помимо этого, он еще позволял показывать сколько было взято товаров, его название, цену. А также в файле views.py тоже был написан код, который позволял сохранять данные на стороне сервера. Сами коды представлены ниже.
scripts.js
$(document).ready(function(){ var form = $('#form_buying_product'); console.log(form); function basketUpdating(product_id, nmb, is_delete){ var data = {}; data.product_id = product_id; data.nmb = nmb; var csrf_token = $('#form_buying_product [name="csrfmiddlewaretoken"]').val(); data["csrfmiddlewaretoken"] = csrf_token; if (is_delete){ data["is_delete"] = true; } var url = form.attr("action"); console.log(data) $.ajax({ url: url, type: 'POST', data: data, cache: true, success: function (data) { console.log("OK"); console.log(data.products_total_nmb); if (data.products_total_nmb || data.products_total_nmb == 0){ $('#basket_total_nmb').text("("+data.products_total_nmb+")"); console.log(data.products); $('.basket-items ul').html(""); $.each(data.products, function(k, v){ $('.basket-items ul').append('
views.py
def basket_adding(request): return_dict = dict() session_key = request.session.session_key data = request.POST product_id = data.get("product_id") nmb = data.get("nmb") is_delete = data.get("is_delete") if is_delete == 'true': ProductInBasket.objects.filter(id=product_id).update(is_active=False) else: new_product, created = ProductInBasket.objects.get_or_create(session_key=session_key, product_id=product_id, is_active=True, defaults={"nmb": nmb}) if not created: new_product.nmb+= int(nmb) new_product.save(force_update=True) products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True) products_total_nmb = products_in_basket.count() return_dict["products_total_nmb"] = products_total_nmb return_dict["products"] = list() for item in products_in_basket: product_dict = dict() product_dict["id"] = item.id product_dict["name"] = item.product.name product_dict["price_per_item"] = item.price_per_item product_dict["nmb"] = item.nmb return_dict["products"].append(product_dict) return JsonResponse(return_dict)
Помимо этого, была создана корзина в шапке сайта, при наведении на которую, она разворачивалась и там были показаны наши товары, а именно: название, цена за шт, количество, а также был крестик, позволяющий удалить товар из корзины. Также, я поработал с библиотекой Ajax. Ajax — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. То есть, я создал в Django-Admin Panel еще одну БД (как создавать БД я рассказывал ниже), в которой отображалась добавленные товары в корзине. И это как раз и было реализовано через Ajax. А для чего это нужно? Это нужно по большей части для анализа данных, какие товары добавляют больше всего, какие удаляют и тд. Итог выполнения представлен ниже.
Как мы видим, в БД показывается ID товара, кол-во, цену за шт, итоговую цену, дату добавления и т.д. Помимо этого, мы видим, что в поле "Is active" стоит зеленая галочка. Это значит, что товар у человека до сих пор находится в корзине, а если товар удалить, то будет красный крестик. Но в ходе создания корзины, я столкнулся с очень серьезной проблемой, а именно: при обновлении страницы или переходе на другую товар пропадал из корзины. Эту проблему я решил с помощью context processors. context processors - это файл, который есть на всех страницах сайта. То есть, при перемещении по сайту, обновлении страницы, товары оставались в корзине и показывалось, сколько их там. Код контекстного процессора и результаты выполнения в целом представлены ниже.
Код context processors
from .models import ProductInBasket def getting_basket_info(request): session_key = request.session.session_key if not session_key: request.session["session_key"] = 123 request.session.cycle_key() products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True) products_total_nmb = products_in_basket.count() return locals()
Итоговый результат реализации корзины