Django:如何在模板中显示购物车中的多个产品

时间:2015-08-20 21:12:45

标签: django django-views e-commerce shopping-cart django-class-based-views

如何将购物车中的多个产品显示在仪表板模板中。我已经为特定的购物车ID编写了CBV,但它没有显示所有产品,只显示了一个首先添加到购物车的产品。即使在管理员中,也只显示一个产品。我想在购物车中显示所有产品。因此,很容易检查客户订购的产品。

views.py

class MyadminCartItemDetailView(DetailView):
model = CartItem
template_name = "mydashboard/cart/cartitem_detail.html"

def get_context_data(self, *args, **kwargs):
context = super(MyadminCartItemDetailView,     self).get_context_data(*args, **kwargs)
return context

cartitem_detail.html

<table class="table table-hover">
<thead>
<tr> 
<th>Cart ID</th>
<th>Cart Items</th>
<th>Baker Name</th>
<th>Product Price</th>
</tr>
</thead>
<tbody>
<tr>
<td>
{{ object.cart }}
</td>
<td>
{{ object.product }}
</td>                      
<td>
{{ object.product.baker }}  
</td>   
<td>
{{ object.product.price }}
</td>
</tr>
</tbody>
</table>

models.py

class CartItem(models.Model):
    cart = models.ForeignKey('Cart', null=True, blank=True)
    product = models.ForeignKey(Product)
    variations = models.ManyToManyField(Variation, null=True, blank=True)
    quantity = models.IntegerField(default=1)
    line_total = models.DecimalField(default=10.99, max_digits=1000, decimal_places=2)
    notes = models.TextField(null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __unicode__(self):
        return self.product.title

    def get_absolute_url(self):
        return reverse('cart_item_detail', kwargs={"id": self.id})


class Cart(models.Model):
    total = models.DecimalField(max_digits=100, decimal_places=2,  default=0.00)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)
    active = models.BooleanField(default=True)

    def __unicode__(self):
        return "Cart id: %s" %(self.id)

我尝试迭代“object.product”,但它返回错误“object.product”不可迭代。列表视图将显示模型CartItem中的所有购物车项目。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

您不应在此处使用DetailView。 Detai View适用于特定的单品。您无法在详细信息视图中迭代产品。

如果您想使用多个产品,请在get_context_data中查询并将上下文发送到模板并在那里进行迭代。

class MyadminCartItemDetailView(TemplateView):
    template_name = "mydashboard/cart/cartitem_detail.html"

    def get_context_data(self, *args, **kwargs):
    context = super(MyadminCartItemDetailView,     self).get_context_data(*args, **kwargs)
    context['products'] = CartItem.objects.all()

    return context

并在您的模板中使用它

{% for product in products %}
    {{product.id}}
    {{product.title}} # Fields related to product
{% endfor %}