Учебный проект — корзина покупателя на Python

Корзина покупателя или shopping cart является неотъемлемой частью интернет магазина. Помимо внешней части видной пользователю в ней существует своя логика, которую мы реализуем в упрощенном виде. Для создания shopping cart или корзины покупателя на Python, используем функции добавления, удаления товара, просмотра. А также главная функция с циклом и пользовательским вводом. В первую очередь создадим глобальную переменную cart для хранения списка товаров, затем определим необходимые функции.
# глобальная переменная доступна из любой точки нашей программы
cart = []
# функция для добавления элементов в список cart, используем метод спиcка: append()
def addItem(item):
cart.append(item)
print(» has been added».format(item))
# функция для удаления элементов
# в теле функции мы используем конструкцию try-except, так как попытка удаления несуществующего
# в списке элемента вызовет ошибку, завершающую нашу программу
def removeItem(item):
try:
cart.remove(item)
print(» has been removed».format(item))
except:
print(«Sorry»)
# Также пользователю нужна иметь возможность просматривать карту
def showCart():
if cart:
print(«Here is your cart:»)
for item in cart:
print( «- «.format(item) )
else:
print(«your cart empty»)
# очистка карты
def clearCart():
cart.clear()
print(«your cart is empty»)
# После создания функций для обработки действий пользователя, необходимо запустить нашу программу через цикл while.
# внутри функции main() создаем булеву переменную и задаем значение False
# внутри цикла просим ввести значение с клавиатуры, и в соответствии с введенным значением
# в условной конструкции if-elif производим вызов функций
def main():
done = False
while not done:
ans = input(«quit/add/remove/show/clear: «).lower()
if ans == «quit»:
print(«Thanks for using program»)
showCart()
done = True
elif ans == «add»:
item = input(«What would you like to add»).title()
addItem(item)
elif ans == «remove»:
item = input(«What would you like to remove»).title()
removeItem(item)
elif ans == «show»:
showCart()
elif ans == «clear»:
clearCart()
else:
print(«That was not in option»)
Таким образом, мы создали глобальную переменную cart, хранящую список товаров, и при помощи наших функций можем изменять непосредственно ее значение, хранящее вводимые нами данные. Программа запускается как скрипт, при этом после выполнения ее завершения никакие данные не сохраняются.

![]()
Создано 22.09.2020 12:16:49
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2024 Русаков Михаил Юрьевич. Все права защищены.
Как реализовать корзину на django?
Только начал изучать django, строго не судите. Есть модель книги и модель корзины куда надо эту книгу и закинуть.
Для корзины создал отдельное приложение. На странице подробного описания книги создал ссылки для добавления ее в корзину.
a href="" Добавить книгу в корзину
По ссылке переходит, все работает, но объект книги в корзину не добавляет.
Что здесь не так?
class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True) summary = models.TextField( max_length=1000, null=True, blank=True, help_text="Enter a brief description of the book" ) isbn = models.CharField( max_length=13, blank=True, help_text='13 Character ISBN number') genre = models.ManyToManyField( Genre, help_text="Select a genre for this book", blank=True) def display_genre(self): return ','.join(genre.name for genre in self.genre.all()[:3]) display_genre.short_description = 'Genre' def __str__(self): return self.title def get_absolute_url(self): return reverse("book_detail", args=[str(self.id)])
class Basket(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='basket') book = models.ForeignKey( Book, on_delete=models.CASCADE) quantity = models.PositiveIntegerField( verbose_name='количество', default=0) add_datetime = models.DateTimeField( verbose_name='время', auto_now_add=True)
def basket(request): content = <> return render(request, 'basketapp/basket.html', content) def basket_add(request, pk): book = get_object_or_404(Book, pk=pk) basket = Basket.objects.filter(user=request.user, book=book).first() if not basket: basket = Basket(user=request.user, book=book) basket.quantity += 1 basket.save() return HttpResponseRedirect(reverse('basketapp:basket')) def basket_remove(request, pk): content = <> return render(request, 'basketapp/basket.html', content)
- Вопрос задан более трёх лет назад
- 9369 просмотров
1 комментарий
Простой 1 комментарий

Модератор @TosterModerator
3. В процессе создания вопроса пользователь Сервиса обязан:
3.8. Использовать для демонстрации фрагментов кода только специальный тег
Решения вопроса 0
Ответы на вопрос 2
1. Оформи код соответственно
2. Модель херня. Научись О2М связям
3. Стоит ли хранить корзины на бэкенде? Их хранят на бэкенде, когда любят спамить людей, бросивших корзины
4. В коде
basket = Basket.objects.filter(user=request.user, book=book).first() if not basket: basket = Basket(user=request.user, book=book) basket.quantity += 1 basket.save()
Вот пример одной корзины, которую я делал несколько лет назад.
basket.py
from collections import UserDict from core.models import ProductOption, Product from .models import Item class Basket(UserDict): changed = False def add(self, quantity=0, option=None, set_=False): self.changed = True id_ = str(option.product.id) option = str(option.id) self.setdefault(id_, <>) self[id_].setdefault(option, 0) if set_: self[id_][option] = quantity else: self[id_][option] += quantity if self[id_][option] return sum(x * prices[product] for product, options in self.items() for _, x in options.items()) def cost(self, option): price = option.product.price return self.count_option(option) * price def count_option(self, option): product_id = str(option.product.id) option_id = str(option.id) return self.get(product_id, <>).get(option_id, 0) def flush(self): self.changed = True for key in list(self): del self[key] def build_order(self, order): items = [] for product_id, data in self.items(): product = Product.objects.get(id=product_id) for option_id, quantity in data.items(): if quantity == 0: continue option = None if option_id != '0': option = ProductOption.objects.get(id=option_id) items.append( Item(order=order, option=option, quantity=quantity, product=product) ) order.items.bulk_create(items) self.flush() return order def fix(self): """Фиксит корзину на случай, если опции удалили, а они находятся в корзине""" ids = self.keys() exist_in_db = (Product.objects .filter(id__in=ids, options__in_stock=True, options__show=True) .values_list('id', flat=True)) to_remove = set(ids) - set(str(x) for x in exist_in_db) for id_ in to_remove: del self[id_] if to_remove: self.changed = True def to_dict(self): return dict(self)
middleware.py
from django.utils.deprecation import MiddlewareMixin from .basket import Basket class BasketMiddleware(MiddlewareMixin): def process_request(self, request): request.basket = Basket(request.session.get('basket', <>)) def process_response(self, request, response): if getattr(request, 'basket', None) is None: return response if request.basket.changed: request.session['basket'] = request.basket.to_dict() request.session.save() return response
settings.py
# . SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' MIDDLEWARE_CLASSES = [ # . 'orders.middleware.BasketMiddleware', ] # .
views.py
@method_decorator(csrf_exempt, name='dispatch') class ChangeBasketOption(View): def post(self, request): change = int(request.POST.get('change')) pk = int(request.POST.get('id')) set_ = bool(request.POST.get('set', 0)) option = get_object_or_404(ProductOption, pk=pk) value = request.basket.add(option=option, quantity=change, set_=set_) cost = request.basket.cost(option) return JsonResponse(< 'value': value, 'cost': cost, 'total': request.basket.total_price >) class Basket(FormView): template_name = 'orders/basket.html' form_class = OrderForm success_url = reverse_lazy('ordered') def get(self, request, *args, **kwargs): request.basket.fix() return super().get(request, *args, **kwargs) def get_context_data(self, **kwargs): kwargs['products'] = Product.objects.filter(id__in=self.request.basket.keys()) kwargs['can_order'] = self.request.basket.total_price >= min_order_cost() return super().get_context_data(**kwargs) def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['user'] = self.request.user return kwargs def form_valid(self, form): order = form.save() order = self.request.basket.build_order(order) mail_new_order(order) return super().form_valid(form)
Смысл в том, что все корзины хранятся только в куках (из-за SESSION_ENGINE) у самих пользователей. Это означает, что хоть миллиард юзеров зайдёт и добавят по миллиону товаров — они не прибавят ни байта занимаемого места на HDD, пока не сделают заказ. К тому же, куки — очень быстрое хранилище и изменения в корзине происходят моментально. К примеру, AJAX запросы в ChangeBasketOption в среднем занимают 30мс в браузере.
Django Корзина в Cookie
Всем привет подскажите как лучше поступить , у меня есть корзина , но когда я не зарегистрирован при добавлении товара в корзину выскакивает ошибка, подскажите как мне лучше сделать чтоб если юзер не залогиненый то создать его корзину в куках и заказ сохранить в бд с пометкой для анонима. models.py
class Cart(models.Model): class Meta: verbose_name = 'Корзина' verbose_name_plural = 'Корзина' unique_together = ('user', 'session_key',) user = models.OneToOneField(User, blank=True, null=True, related_name='cart',on_delete=models.CASCADE) owner = models.ForeignKey('Customer',null=True, verbose_name='Владелец',on_delete=models.CASCADE) products = models.ManyToManyField(CartProduct,blank=True,related_name='related_cart') total_products = models.PositiveIntegerField(default=0) final_price = models.DecimalField(max_digits=10,default=0, decimal_places=2,verbose_name='Общая сумма') in_order= models.BooleanField(default=False) for_anonymoys_user= models.BooleanField(default=False) session_key = models.CharField(max_length=40,null=True,blank=True) def __str__(self): return str(self.id) class CartProduct(models.Model): class Meta: verbose_name = 'Продукт для корзины' verbose_name_plural = 'Продукты для корзины' user = models.ForeignKey('Customer',verbose_name='Покупатель', on_delete=models.CASCADE) cart = models.ForeignKey('Cart',verbose_name='Корзина',on_delete=models.CASCADE,related_name='related_products') # #########################################&&&&&&&&&&. product= models.ForeignKey(Product,verbose_name='Товар',on_delete=models.CASCADE) qty = models.PositiveIntegerField(default=1) final_price = models.DecimalField(max_digits=10,decimal_places=2,verbose_name='Общая сумма') def __str__(self): return "Продукт: <> (для корзины)".format(self.product.title) def save(self, *args, **kwargs): self.final_price = self.qty * self.product.price super().save(*args, **kwargs) class Customer(models.Model): class Meta: verbose_name = 'Покупатель' verbose_name_plural = 'Покупатели' user = models.ForeignKey(User, verbose_name='Пользователь', on_delete=models.CASCADE) phone = models.CharField(max_length=20, verbose_name='Номер телефона') adress = models.CharField(max_length=255, verbose_name='Адрес', null=True, blank=True) orders = models.ManyToManyField('Order', verbose_name='Заказы покупателя', related_name='related_order') def __str__(self): return "Покупатель: <> <>".format(self.user.first_name, self.user.last_name) class Order(models.Model): class Meta: verbose_name = 'Заказ' verbose_name_plural = 'Заказы' STATUS_NEW ='new' STATUS_IN_PROGRESS='in_progress' STATUS_READY= 'is_ready' STATUS_COMPLETED= 'completed' STATUS_DEACTIVE='deactive' BUYING_TYPE_SELF= 'self' BUYING_TYPE_DELIVERY = 'delivery' STATUS_CHOICES= ( (STATUS_NEW,'Новый заказ'), (STATUS_IN_PROGRESS,'Заказ в обработке'), (STATUS_READY,'Заказ готов'), (STATUS_COMPLETED,'Заказ выполнен'), (STATUS_DEACTIVE,'Заказ Отменен') ) BUYING_TYPE_CHOICES=( (BUYING_TYPE_SELF,'Самовывоз'), (BUYING_TYPE_DELIVERY,'Доставка') ) customer = models.ForeignKey(Customer, verbose_name='Покупатель', related_name='related_orders', on_delete=models.CASCADE) first_name = models.CharField(max_length=255, verbose_name='Имя') last_name = models.CharField(max_length=255, verbose_name='Фамилия') phone = models.CharField(max_length=20, verbose_name='Телефон') cart = models.ForeignKey(Cart, verbose_name='Корзина', on_delete=models.CASCADE, null=True, blank=True) adress = models.CharField(max_length=1024, verbose_name='Адрес', null=True, blank=True) otdel = models.CharField(max_length=20,verbose_name='Отделение', null=True, blank=True) status = models.CharField( max_length=100, verbose_name='Статус заказ', choices=STATUS_CHOICES, default=STATUS_NEW ) buying_type = models.CharField( max_length=100, verbose_name='Тип заказа', choices=BUYING_TYPE_CHOICES, default=BUYING_TYPE_SELF ) comment = models.TextField(verbose_name='Комментарий к заказу', null=True, blank=True) created_at = models.DateTimeField(auto_now=True, verbose_name='Дата создания заказа') order_date = models.DateField(verbose_name='Дата получения заказа', default=timezone.now) def __str__(self): return str(self.id) class Rewiews(models.Model): name= models.CharField(max_length=255, verbose_name='Имя') text= models.TextField('Сообщение',max_length=500) parent= models.ForeignKey( 'self',verbose_name='Родитель',on_delete=models.SET_NULL,blank=True,null=True ) product=models.ForeignKey(Product,verbose_name='Продукт',on_delete=models.CASCADE) data = models.DateTimeField(auto_now=True,db_index=True,verbose_name='Добавлено') def __str__(self): return f"-" class Meta: verbose_name='Отзыв' verbose_name_plural='Отзывы'
cartmixins.py
class CartMixin(View): def dispatch(self,request,*args,**kwargs): if request.user.is_authenticated: customer = Customer.objects.filter(user=request.user).first() if not customer: customer= Customer.objects.create( user=request.user ) cart = Cart.objects.filter(owner=customer,in_order=False).first() if not cart: cart= Cart.objects.create(owner=customer) else: cart= Cart.objects.filter(for_anonymoys_user=True).first() if not cart: cart= Cart.objects.create(for_anonymoys_user=True) self.cart=cart self.cart.save() return super().dispatch(request,*args,**kwargs)
class AddToCartView(CartMixin,View): def get(self,request,*args,**kwargs): product_slug= kwargs.get('slug') product= Product.objects.get(slug=product_slug) if request.user.is_authenticated: cart_product,created=CartProduct.objects.get_or_create( user=self.cart.owner,cart=self.cart,product=product ) if created: self.cart.products.add(cart_product) recalc_cart(self.cart) messages.add_message(request,messages.INFO,'Товар добавлен в корзину') return redirect(product.get_absolute_url()) else: # print(request.session['cartanon']) cart, created = Cart.objects.get_or_create( session_key = request.session.session_key, defaults = ) return redirect(product.get_absolute_url()) # except: # new_cart = Cart() # new_cart.save() # request.session["cart_id"] = new_cart.id # new_cart.products.add(product) # new_cart.save() # return HttpResponse("okkk!
") class DeleteFomCartView(CartMixin,View): def get(self,request,*args,**kwargs): product_slug=kwargs.get('slug') product= Product.objects.get(slug=product_slug) cart_product=CartProduct.objects.get( user=self.cart.owner,cart=self.cart,product=product ) self.cart.products.remove(cart_product) cart_product.delete() recalc_cart(self.cart) messages.add_message(request,messages.INFO,'Товар Удален') return HttpResponseRedirect('/cart/') class ChangeQTYView(CartMixin,View): def post(self,request,*args,**kwargs): product_slug= kwargs.get('slug') product= Product.objects.get(slug=product_slug) cart_product=CartProduct.objects.get( user=self.cart.owner,cart=self.cart,product=product ) if request.POST.get('qty')=='1': cart_product.qty+=1 cart_product.save() recalc_cart(self.cart) if request.POST.get('qty')=='0': cart_product.qty-=1 cart_product.save() recalc_cart(self.cart) messages.add_message(request,messages.INFO,'Кол-во изменено') return HttpResponseRedirect('/cart/') class CartView(CartMixin, View): def get(self, request, *args, **kwargs): category = Category.objects.all() context = < 'cart': self.cart, 'category': category >return render(request, 'cart.html', context) class CheckoutView(CartMixin, View): def get(self, request, *args, **kwargs): category = Category.objects.all() form=OrderForm(request.POST or None) context = < 'cart': self.cart, 'category': category, 'form': form >return render(request, 'checkout.html', context) class MakeOrderView(CartMixin,View): def post(self, request, *args, **kwargs): form = OrderForm(request.POST or None) customer = Customer.objects.get(user=request.user) if form.is_valid(): new_order = form.save(commit=False) new_order.customer = customer new_order.phone = form.cleaned_data['phone'] phone=form.cleaned_data['phone'] new_order.first_name = form.cleaned_data['first_name'] name=form.cleaned_data['first_name'] new_order.last_name = form.cleaned_data['last_name'] new_order.adress = form.cleaned_data['adress'] email=form.cleaned_data['adress'] new_order.otdel = form.cleaned_data['otdel'] new_order.buying_type = form.cleaned_data['buying_type'] new_order.order_date = form.cleaned_data['order_date'] new_order.comment = form.cleaned_data['comment'] comment=form.cleaned_data['comment'] new_order.save() self.cart.in_order = True self.cart.save() new_order.cart = self.cart new_order.save() customer.orders.add(new_order) # email=form.cleaned_data['adress'] # print(email) # name= form.cleaned_data['first_name'] # body= form.cleaned_data['phone'] send_email(email,name,phone,comment) messages.add_message(request, messages.INFO, 'Спасибо за заказ! Менеджер с Вами свяжется') return HttpResponseRedirect('/') return HttpResponseRedirect('/checkout/')
Разработка интернет-магазина на фреймворке Django
Данная работа посвящена разработке интернет-магазина техники на фреймворке Django. Данный магазин включает в себя главную страницу с основной информацией, витриной товаров, страницей товаров с возможностью добавления в корзину, сама корзина с возможностью удаления оттуда товаров, страница оформления заказа, регистрация и авторизация пользователей.
В первую очередь стоит начать с Главной страницы, на ней реализовано несколько блоков, которые отвечают за маркетинг. Также реализован набор пунктов необходимых для продуктивной работы на сайте. Главная страница должна быть яркой и броской, чтобы привлечь внимание покупателей.

Далее необходимо рассмотреть страницу товара, здесь представлен сам товар, также представлено его описание, реализована возможность выбирать количество товара и добавлять товар в корзину. Также можно оставить комментарий к товару.

Покупатель путешествует по магазину и выбирает товары, все выбранные товары сохраняются в корзине. Товары отображаются вместе с картинкой и названием. Реализована возможность убрать товар из корзины, также увеличить или уменьшить его количество, реализована возможность применить промо-код.

Оформление заказа, происходит следующим образом, пользователь заполняет поля необходимые для доставки. Рядом с ввденными данными дублируется заказ покупателя, для того чтобы он мог его проверить, выводится сумма, чтобы клиент видел стоимость своего заказа. Пользователь может выбрать способ оплаты, либо оплатить заказ при получении наличными или же использовать платежную систему.

Также результат выполненной работы можно посмотреть на GitHub. Там подробно изложены все файл, а также архитектура Магазина.
HTML шаблон: https://colorlib.com/etc/fashe/index.html
GitHub : https://github.com/art01alex/Django/
ВЫВОД
Исходя из проделанной мною работой, я могу смело сказать, что фреймворк Django не зря является одним из самых популярных в мире. Потому что у него очень развитая экосистема, он постоянно изменяется и усовершенствуется, в случае возникновения трудностей найти ответ на конкретный вопрос не составляет труда, ведь тысячи специалистов уже решали такие же проблемы до нас и делились своим опытом в интернете. Помимо этого, Django поддерживает использование различных библиотек при разработке веб-приложений.