简体   繁体   中英

How to do a variation in Views.py for add to cart function

  1. I just need to make the add to cart have variation like for example S,M,L

  2. This is not Django Rest Framework i want to make it using Django only

  3. I don't have Forms for the variation, if it's wrong can you please help me

  4. 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

Error Screenshot

Error Screenshots (Traceback)

I add "Sugar" in Variation

In ItemVariation

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM