MODEL: class Item(models.Model): title = models.CharField(max_length=250) price = models.IntegerField() discount_price = models.IntegerField(null=True, blank=True) description = HTMLField() category = models.CharField(choices=CATEGORY_CHOICES, max_length=2) label = models.CharField(choices=LABEL_CHOICES, max_length=1) slug = models.SlugField(unique=True,max_length=250) def __str__(self): return self.title def get_absolute_url(self): return reverse("product-detail", kwargs={ 'slug': self.slug }) def get_add_to_cart_url(self): return reverse("add-to-cart", kwargs={ 'slug': self.slug }) def get_remove_from_cart_url(self): return reverse("remove-from-cart", kwargs={ 'slug': self.slug }) class VariationManager(models.Manager): def all(self): return super(VariationManager, self).filter(active=True) def sizes(self): return self.all().filter(category='size') def colors(self): return self.all().filter(category='color') VAR_CATEGORIES = ( ('size', 'size'), ('color', 'color'), ('package', 'package'), ) class Variation(models.Model): item = models.ForeignKey(Item, on_delete=models.CASCADE) category = models.CharField(max_length=120, choices=VAR_CATEGORIES, default='size') title = models.CharField(max_length=120) active = models.BooleanField(default=True) objects = VariationManager() def __str__(self): return self.title def get_add_to_cart_url(self): return reverse("add-to-cart", kwargs={ 'slug': self.slug }) def get_remove_from_cart_url(self): return reverse("remove-from-cart", kwargs={ 'slug': self.slug }) class OrderItem(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) ordered = models.BooleanField(default=False) item = models.ForeignKey(Item, on_delete=models.CASCADE) quantity = models.IntegerField(default=1) variation = models.ManyToManyField(Variation) def __str__(self): return f"{self.quantity} of {self.item.title}" def get_total_item_price(self): return self.quantity * self.item.price def get_total_discount_item_price(self): return self.quantity * self.item.discount_price def get_amount_saved(self): return self.get_total_item_price() - self.get_total_discount_item_price() def get_final_price(self): if self.item.price:#self.item.discount_price: return self.get_total_item_price()#self.get_total_discount_item_price() #return self.get_total_item_price() class Order(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) items = models.ManyToManyField(OrderItem) start_date = models.DateTimeField(auto_now_add=True) ordered_date = models.DateTimeField() ordered = models.BooleanField(default=False) def __str__(self): return self.user.username def get_total(self): total = 0 for order_item in self.items.all(): total += order_item.get_final_price() return total VIEWS.PY: def add_to_cart(request,slug): item = get_object_or_404(Item,slug=slug) order_item_qs = OrderItem.objects.filter( item=item, user=request.user, ordered=False ) item_var = [] #item variation if request.method == 'POST': for items in request.POST: key = items val = request.POST[key] try: v = Variation.objects.get( item=item, category__iexact=key, title__iexact=val ) item_var.append(v) except: pass if len(item_var) > 0: #order_item_qs.variation.clear() for items in item_var: order_item_qs = order_item_qs.filter( variation__exact=items, ) if order_item_qs.exists(): order_item = order_item_qs[0] # for order_item in order_item_qs: # order_item = order_item_qs.first() order_item.quantity += 1 order_item.save() #print(order_item_qs) else: order_item = OrderItem.objects.create( item=item, user=request.user, ordered=False ) order_item.variation.add(*item_var) order_item.save() order_qs = Order.objects.filter(user=request.user, ordered=False) if order_qs.exists(): order = order_qs[0] #check if the order item is in the order if not order.items.filter(item__id=order_item.id).exists(): order.items.add(order_item) messages.info(request, "This item quantity was updated.") return redirect("order-summary") else: ordered_date = timezone.now() order = Order.objects.create(user=request.user, ordered_date=ordered_date) order.items.add(order_item) messages.info(request, "This item was added to cart.") return redirect("order-summary") TEMPLATE (Order Summary): <div class="quantity buttons_added"> <a href="{% url 'remove-single-item-from-cart' order_item.item.slug %}"><input type="button" value="-" class="minus"></a> <input type="number" value="{{ order_item.quantity }}" title="Qty" class="input-text qty text" size="4" pattern="" inputmode=""> <a href="{% url 'add-to-cart' order_item.item.slug %}"> <input type="button" value="+" class="plus"></a> </div> TEMPLATE (Product details): <form class="form" method="POST" action="{{ items.get_add_to_cart_url }}"> {% csrf_token %} <input class="btn btn-default btn-block" type="submit" value="Add to cart"> {% if items.variation_set.all %} {% if items.variation_set.sizes %} <select class="form-control" name="size"> {% for items in items.variation_set.sizes %} <option value="{{ items.title|lower }}">{{ items.title|capfirst }}</option> {% endfor %} </select> {% endif %} {% if items.variation_set.colors %} <select class="form-control" name="color"> {% for items in items.variation_set.colors %} <option value="{{ items.title|lower }}">{{ items.title|capfirst }}</option> {% endfor %} </select> {% endif %} {% endif %} </form> -- 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+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/3740b3e4-b535-4d37-8cc5-298aa97c6bcc%40googlegroups.com.
No comments:
Post a Comment