代码之家  ›  专栏  ›  技术社区  ›  chiseledCoder

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

  •  0
  • chiseledCoder  · 技术社区  · 10 年前

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

    视图.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>
    

    型号.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.prproduct”不可迭代。列表视图将显示模型CartItem中的所有购物车项目。有什么办法吗?

    1 回复  |  直到 10 年前
        1
  •  3
  •   gamer    10 年前

    您不应在此处使用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 %}