[英]How to do a variation in Views.py for add to cart function
我只需要让添加到购物车有变化,例如 S、M、L
这不是 Django Rest Framework 我想只使用 Django
我没有变体的表格,如果有错,你能帮我吗
我正在关注 JustDjango Ecommerce,但我正在使用代码构建自己的网站,并尝试仅使用 Django 添加一些变体。 不使用 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")
<--错误-->
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
在您的 for 循环下方尝试替换:
order_item_qs = order_item_qs.filter(
Q(item_variations__exact=v)
)
和:
order_item_qs = order_item_qs.filter(item_variations__variation=v)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.