Django:按人员顺序计数和显示项目数量

问题描述

我试图显示一个人订单中有多少种产品。我该怎么做呢?我想在order_detail.html页面显示商品总数。

下面是我的代码供参考。

models.py:

class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    order_id = models.CharField(max_length=20,default=increment_order_id,null=True,blank=True,editable=False)
    location = models.ForeignKey(Location,on_delete=models.CASCADE)
    route = models.ForeignKey(Route,on_delete=models.DO_nothing,blank=True)
    delivery_date = models.DateField()
    created = models.DateTimeField(auto_Now_add=True)
    updated = models.DateTimeField(auto_Now=True)
    paid = models.BooleanField(default=False)
    discount = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)


class OrderItem(models.Model):
    order = models.ForeignKey(Order,on_delete=models.PROTECT,related_name='items',null=True)
    desc = models.CharField(max_length=500,null=True)
    # Item
    product = models.ForeignKey(Product,related_name='order_items')
    price = models.DecimalField(max_digits=10,default=0.00)
    quantity = models.IntegerField(default=1,null=False)

views.py:

@method_decorator(login_required(login_url='account_login'),name='dispatch')
class OrderListView(ListFilteredMixin,ListView):
    model = Order
    template_name = 'orders/order/list.html'
    filter_set = OrderFilter
    queryset = Order.objects.all()
 

@login_required(login_url='account_login')
def order_detail(request,order_id):
    order = get_object_or_404(Order,order_id=order_id)
    order_item = OrderItem.objects.filter(order=order)

    context = {
        'order': order,'order_item': order_item
         }
    return render(request,'orders/order/detail.html',context)

解决方法

将代码更新为此:

class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    order_id = models.CharField(max_length=20,default=increment_order_id,null=True,blank=True,editable=False)
    location = models.ForeignKey(Location,on_delete=models.CASCADE)
    route = models.ForeignKey(Route,on_delete=models.DO_NOTHING,blank=True)
    delivery_date = models.DateField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)
    discount = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)
    
    def count_items(self):
        return self.items.count()

然后以{{ order.count_items }}的html格式调用