简体   繁体   English

如何在 Views.py 中更改添加到购物车功能

[英]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我只需要让添加到购物车有变化,例如 S、M、L

  2. This is not Django Rest Framework i want to make it using Django only这不是 Django Rest Framework 我想只使用 Django

  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.我正在关注 JustDjango Ecommerce,但我正在使用代码构建自己的网站,并尝试仅使用 Django 添加一些变体。 without using Django Rest Framework不使用 Django Rest Framework

    <--models.py--> <--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--> <--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在 ItemVariation

Just below your for loop try replacing:在您的 for 循环下方尝试替换:

order_item_qs = order_item_qs.filter(
            Q(item_variations__exact=v)
        )

With:和:

order_item_qs = order_item_qs.filter(item_variations__variation=v)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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