首页 > 解决方案 > 为什么 m2m 的 add() 方法不适用于单个对象 - django

问题描述

我正在尝试使用add方法将对象添加到 m2m 但既没有显示错误也没有添加项目,我不明白为什么

这是我的观点:

class UpdateCartView(generic.UpdateView):
    model = Cart
    fields = ['products']
    template_name = 'update_cart.html'
    success_url = reverse_lazy('carts:home')
    def form_valid(self,form):
        product = ProductCreateModel.objects.get(pk = self.request.POST.get('product'))
        size = Size.objects.get(pk = self.request.POST.get('size'))
        colour = Colour.objects.get(pk = self.request.POST.get('colour'))
        products =  Products.objects.create(product = product,
                size = size,
                quantity = int(self.request.POST.get('quantity')),
                colour = colour)
        product.save()
        cart = self.get_object()
        print(products)
        cart.products.add(products)
        cart.save()
        return super(UpdateCartView,self).form_valid(form)
    def get_object(self):
        cart_obj, cart_created = Cart.objects.new_or_get(self.request)
        return cart_obj

这是我的模型:

class Products(models.Model):
    product = models.ForeignKey(ProductCreateModel,on_delete=models.CASCADE,related_name='cart_product')
    quantity = models.PositiveIntegerField(default=1,validators=[MinValueValidator(1)])
    size    = models.ForeignKey(Size,related_name='cart_product_size',on_delete=models.CASCADE,null=True,blank=False)
    colour = models.ForeignKey(Colour,related_name='cart_product_colour',on_delete=models.CASCADE,null=True,blank=False)
    def __str__(self):
        return '{product}({quantity})'.format(product=self.product,quantity=self.quantity)


class Cart(models.Model):
    MESSAGE_CHOICES = (
        ('A' , 'Items are added to you cart'),
        ('R' , 'Items are removed from cart'),
        ('PC' , 'Price of some items has changed'),
    )
    messages    = models.CharField(max_length=1, choices=MESSAGE_CHOICES,null=True,blank=True)
    user        = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    products    = models.ManyToManyField(Products, blank=True)
    subtotal    = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    total       = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    updated     = models.DateTimeField(auto_now=True)
    timestamp   = models.DateTimeField(auto_now_add=True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)


def m2m_changed_cart_receiver(sender, instance, action, *args, **kwargs):
    if action == 'post_add' or action == 'post_remove' or action == 'post_clear':
        products = instance.products.all()
        total = 0
        for x in products:
            total += (x.product.final_price * x.quantity)
        if instance.subtotal != total:
            instance.subtotal = total
            instance.save()

def pre_save_cart_receiver(sender, instance, *args, **kwargs):
    if instance.subtotal > 0:
        instance.total = Decimal(instance.subtotal) * Decimal(1.08) # 8% tax
    else:
        instance.total = 0.00

一切正常,没有错误,也打印,products但在我的管理面板中显示空购物车意味着cart.products.add(products)没有添加产品,为什么?

标签: djangopython-3.xdjango-modelsdjango-formsdjango-views

解决方案


推荐阅读