Hello, I am practicing for my college exams. I am building a Restaurant Order System with Django and I am using Django sessions for the first. I borrowed some ideas from the "Django by example".
Below you can find the MenuItem model and Order Model. class MenuItem(models.Model): category = models.ForeignKey(Category, related_name='menu_items') # table ??? name = models.CharField(max_length=255, db_index=True) slug = models.SlugField(max_length=255, db_index=True, default='') description = models.TextField(blank=True) image = models.ImageField(upload_to='menu_items/%Y/%m/%d', blank=True) price = models.DecimalField(max_digits=10, decimal_places=2) available = models.BooleanField(default=True) added_on = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) class Order(models.Model): STATUS_CHOICES = ( ('in behandeling', 'In behandeling'), ('klaar', 'Klaar') ) # random_id = models.CharField(max_length=255) table = models.ForeignKey(settings.AUTH_USER_MODEL) item = models.ForeignKey(MenuItem, related_name='order_items') price = models.DecimalField(max_digits=10, decimal_places=2) quantity = models.PositiveIntegerField(default=1) status = models.CharField(max_length=50, choices=STATUS_CHOICES, default='in behandeling') paid = models.BooleanField(default=False) timestamp = models.DateTimeField(auto_now_add=True) Below you can find a Cart class which handles adding, removing, iterating etc. over the Menu Items using Django sessions. What I need is a function in this class that only clears the items I have in the cart, but I still need the total price. Right now I have the "clear" function which removes the entire cart from the session. But since I am kinda confused on how to do this I need some help. from decimal import Decimal from django.conf import settings from menu.models import MenuItem class Cart: def __init__(self, request): self.session = request.session cart = self.session.get(settings.CART_SESSION_ID) if not cart: cart = self.session[settings.CART_SESSION_ID] = {} self.cart = cart def add(self, menu_item, quantity=1, update_quantity=False): # Add a menu item to the cart or update its quantity menu_item_id = str(menu_item.id) if menu_item_id not in self.cart: self.cart[menu_item_id] = {'quantity': 0, 'price': str(menu_item.price)} if update_quantity: self.cart[menu_item_id]['quantity'] = quantity else: self.cart[menu_item_id]['quantity'] += quantity self.save() def save(self): # Update the session cart self.session[settings.CART_SESSION_ID] = self.cart # Mark the session as "modified" to make sure its saved self.session.modified = True def remove(self, menu_item): # Remove a product from the cart menu_item_id = str(menu_item.id) if menu_item_id in self.cart: del self.cart[menu_item_id] self.save() def __iter__(self): # Iterate over the item in the cart and get the products from the DB menu_item_ids = self.cart.keys() # get thte product objects and add them to the cart menu_items = MenuItem.objects.filter(id__in=menu_item_ids) for menu_item in menu_items: self.cart[str(menu_item.id)]['menu_item'] = menu_item for item in self.cart.values(): item['price'] = Decimal(item['price']) item['total_price'] = item['price'] * item['quantity'] yield item def __len__(self): # Count all the items in the cart return sum(item['quantity'] for item in self.cart.values()) def get_total_price(self): return sum(Decimal(item['price']) * item['quantity'] for item in self .cart.values()) def clear(self): # Remove cart from the session del self.session[settings.CART_SESSION_ID] self.session.modified = True And below here you'll find the view that handles saving the items in the request cart in to the Order model. Instead of calling the cart.clear() function I need to call a function that removes the ordered items from the cart while still having the total price in this session. @login_required def create_order(request): cart = Cart(request) if request.method == 'POST': for item in cart: Order.objects.create(table=request.user, item=item['menu_item'], price=item['price'], quantity=item['quantity']) cart.clear() return render(request, 'orders/order_success.html', {'cart': cart}) return render(request, 'cart/cart_detail.html', {'cart': cart}) I hope my question is clear and someone can help me with this. -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/0582629f-92df-496d-92de-4b92eb20445f%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.