首页 > 解决方案 > 如何调用方法并将其传递给 django 中另一个类模型的字段?

问题描述

我正在创建一个电子商务 Web 应用程序。我已完成添加到购物车并正在构建提款视图。我在获取订购商品的总价格时遇到问题。

模型.py

class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                            on_delete=models.CASCADE)
    item = models.OneToOneField(Item, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    ordered = models.BooleanField(default=False)
    
    def __str__(self):
        return f"{self.quantity} of {self.item.title}"
    
    def get_total_item_price(self):
        return self.quantity * self.item.price
    
    def get_final_price(self):
        return self.get_total_item_price()
    
    
class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)
    total_price = models.IntegerField(default=0)

    def __str__(self):
        return self.user.username
    
    def get_total(self):
        total = 0
        for order_item in self.items.all():
            total += order_item.get_final_price()
        return total
    
    def save(self, *args, **kwargs):
        self.total_price = self.get_total()
        return super().save(*args, **kwargs)

我试图覆盖Order 类的保存函数,以将价格总额传递给total_price 字段。我没有收到任何错误消息,但该字段不会更新。它仍然显示默认值而不是总价格。

视图.py

class OrderSummaryView(LoginRequiredMixin, DetailView):

    def get(self, request, *args, **kwargs):
        try:
            order = Order.objects.get(user=self.request.user, ordered=False)
            context = {
                'object': order
            }
            return render(self.request, 'ecommpage/order_summary.html', context)
        except ObjectDoesNotExist:
            messages.error(self.request, "You do not have an active order")
            return redirect('/')


    @login_required
    def add_to_cart(request, slug):
        item = get_object_or_404(Item, slug=slug)
        order_item, created = OrderItem.objects.get_or_create(
            item=item,
            user=request.user,
            ordered=False,
        )
        order_qs = Order.objects.filter(user=request.user, ordered=False)
        if order_qs.exists():
            order = order_qs[0]
            # check if the order item is in the order
            if order.items.filter(item__slug=item.slug).exists():
                order_item.quantity += 1
                order_item.save()
                messages.success(request, "This item was updated to your cart.")
            else:
                messages.success(request, "This item was added to your cart.")
                order.items.add(order_item)
        else:
            ordered_date = timezone.now()
            order = Order.objects.create(
                user=request.user, ordered_date=ordered_date)
            order.items.add(order_item)
            messages.success(request, "This item was added to your cart.")
        return redirect("product", slug=slug)
    
    @login_required
    def remove_from_cart(request, slug):
        item = get_object_or_404(Item, slug=slug)
        order_qs = Order.objects.filter(
            user=request.user,
            ordered=False
        )
        if order_qs.exists():
            order = order_qs[0]
            # check if the order item is in the order
            if order.items.filter(item__slug=item.slug).exists():
                order_item = OrderItem.objects.filter(
                    item=item,
                    user=request.user,
                    ordered=False
                )[0]
                if order_item.quantity > 1:
                    order_item.quantity -= 1
                    order_item.save()
                else:
                    order.items.remove(order_item)
                messages.warning(request, "This item was removed from your cart.")
                return redirect("product", slug=slug)
            else:
                messages.warning(request, "This item was not in your cart.")
                return redirect("product", slug=slug)
        else:
            messages.warning(request, "You do not have an active order")
            return redirect("product", slug=slug)
       

标签: djangodjango-modelsdjango-views

解决方案


推荐阅读