I just need to make the add to cart have variation like for example S,M,L
This is not Django Rest Framework i want to make it using Django only
I don't have Forms for the variation, if it's wrong can you please help me
I'm Following JustDjango Ecommerce but i'm building my own web using the code and trying to add some variation using only Django. without using Django Rest Framework
<--models.py-->
class Food(models.Model): class NewManager(models.Manager): def get_queryset(self): return super().get_queryset() .filter(avail=True) title = models.CharField(max_length=100) price = models.DecimalField(max_digits=5, decimal_places=2) discount_price = models.FloatField(blank=True, null=True) category = models.ForeignKey(Category,on_delete=models.CASCADE,blank=True,null=True) Package = models.ForeignKey(Pack,on_delete=models.CASCADE,blank=True,null=True) per = models.CharField(choices=PR,max_length=2,blank=True,null=True) top = models.BooleanField(_('Top Selling'),default=False) slug = models.SlugField() description = models.TextField() image = models.ImageField(blank=False,null=False) avail = models.BooleanField(_('Available'),default=True) navail = models.BooleanField(_('Not Available'),default=False) def __str__(self): return self.title class Variation(models.Model): item = models.ForeignKey(Food, on_delete=models.CASCADE) name = models.CharField(max_length=50) # size class Meta: unique_together = ( ('item', 'name') ) def __str__(self): return self.name class ItemVariation(models.Model): variation = models.ForeignKey(Variation, on_delete=models.CASCADE) value = models.CharField(max_length=50) # S, M, L attachment = models.ImageField(blank=True) class Meta: unique_together = ( ('variation', 'value') ) def __str__(self): return self.value class OrderItem(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) ordered = models.BooleanField(default=False) item = models.ForeignKey(Food, on_delete=models.CASCADE) item_variations = models.ManyToManyField(ItemVariation) quantity = models.IntegerField(default=1)
<--Views.py-->
@login_required def add_to_cart(request, slug, *args, **kwargs): item = get_object_or_404(Food, slug=slug) variations = Variation.objects.all() minimum_variation_count = Variation.objects.filter(item=item).count() if len(variations) < minimum_variation_count: return redirect("resto:order") order_item_qs = OrderItem.objects.filter( item=item, user=request.user, ordered=False ) for v in variations: order_item_qs = order_item_qs.filter( Q(item_variations__exact=v) ) if order_item_qs.exists(): order_item = order_item_qs.first() order_item.quantity += 1 order_item.save() else: order_item = OrderItem.objects.create( item=item, user=request.user, ordered=False ) order_item.item_variations.add(*variations) order_item.save() order_qs = Order.objects.filter(user=request.user, ordered=False) if order_qs.exists(): order = order_qs[0] if not order.items.filter(item__id=order_item.id).exists(): order.items.add(order_item) return redirect("resto:order") else: ordered_date = timezone.now() order = Order.objects.create( user=request.user, ordered_date=ordered_date) order.items.add(order_item) return redirect("resto:order")
<--Error-->
I add a Variation name "Sugar" just for Example when I click Add to Cart this Error show up.
ValueError at /add-to-cart/item-1/
Cannot query "Sugar": Must be "ItemVariation" instance.
Request Method: GET
Request URL: http://127.0.0.1:8000/add-to-cart/item-1/
Django Version: 2.2
Exception Type: ValueError
Exception Value: Cannot query "Sugar": Must be "ItemVariation" instance.
Exception Location: C:\Users\Admin\djangoproj\cafe\cdc\lib\site-packages\django\db\models\sql\query.py in check_query_object_type, line 1065
Python Executable: C:\Users\Admin\djangoproj\cafe\cdc\Scripts\python.exe
Python Version: 3.8.3
Python Path:
['C:\\Users\\Admin\\djangoproj\\cafe\\src',
'C:\\Users\\Admin\\djangoproj\\cafe\\cdc\\Scripts\\python38.zip',
'c:\\users\\admin\\appdata\\local\\programs\\python\\python38-32\\DLLs',
'c:\\users\\admin\\appdata\\local\\programs\\python\\python38-32\\lib',
'c:\\users\\admin\\appdata\\local\\programs\\python\\python38-32',
'C:\\Users\\Admin\\djangoproj\\cafe\\cdc',
'C:\\Users\\Admin\\djangoproj\\cafe\\cdc\\lib\\site-packages',
'c:\\users\\admin\\djangoproj\\cafe\\cdc\\src\\django-oscar-cash-on-delivery']
Server time: Fri, 25 Sep 2020 03:05:29 +0000
Just below your for loop try replacing:
order_item_qs = order_item_qs.filter(
Q(item_variations__exact=v)
)
With:
order_item_qs = order_item_qs.filter(item_variations__variation=v)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.