Django 计算总成本并将销售税添加到购物车

Django 计算总成本并将销售税添加到购物车,django,calculator,cart,Django,Calculator,Cart,我正在创建一个基本的购物车应用程序,我可以在我的购物车中获得所有的商品,以填充数量和成本,但我正在尝试找到一种方法,我可以创建一个总成本,并在其上添加销售税。很明显,总行是个问题,但我不确定我能做些什么来填充所有产品的价格和数量,并将它们相乘 {% for addtocart in userCart %} <li>Quantity:{{addtocart.quantity}} <a href="/products/{{addtocart.product.id}}">{

我正在创建一个基本的购物车应用程序,我可以在我的购物车中获得所有的商品,以填充数量和成本,但我正在尝试找到一种方法,我可以创建一个总成本,并在其上添加销售税。很明显,总行是个问题,但我不确定我能做些什么来填充所有产品的价格和数量,并将它们相乘

{% for addtocart in userCart %}
  <li>Quantity:{{addtocart.quantity}} <a href="/products/{{addtocart.product.id}}">{{addtocart.product.prodName}}</a> ${{addtocart.product.prodPrice}}(<a
href=/delItem/{{addtocart.id}}>Remove</a>)<br>
{% endfor %}
</ul>
{% else %}
<p> No products available </p>
{% endif %}
***<p>Total: {{addtocart.quantity}}"x"{{addtocart.product.prodPrice}}***
models.py

from django.db import models
from django.forms import ModelForm

# Create your models here.
class prod(models.Model):
        prodName = models.CharField(max_length=100)
        prodDesc = models.TextField()
        prodPrice = models.FloatField()
        prodImage = models.ImageField(upload_to="userimages/")
        def __unicode__(self):
                return self.prodName

class Cart(models.Model):
        session = models.CharField(max_length=100)
        product = models.ForeignKey('prod')
        quantity = models.IntegerField()

        def __unicode__(self):
                return self.name

class CartForm(ModelForm):
        class Meta:
                model = Cart
                exclude = ('session')

有两种方法可以做到这一点:

  • 计算视图中的总数,并将其作为单独的变量传入
  • 定义一个执行乘法的自定义模板标记(Django默认情况下没有)
  • (1) 更详细地说:

    在你看来:

    def userHistory(request):
        userCart = Cart.objects.filter(session = request.session.session_key[:20])
        totalCost = 0
        for item in userCart:
            totalCost += item.quantity * item.product.prodPrice
        return render_to_response('Products/history.html', {'userCart':userCart,
            'totalCost': totalCost})
    
    然后在模板中:
    {{totalCost}}

    (2) 更详细地说:

    首先创建一个新文件my_app/templatetags/my_tags.py(也在这个目录中放置一个uuu init_uuu.py文件,以便Python知道它是一个包)


    然后在模板顶部添加
    {%load my_tags%}
    ,您就可以使用
    {{addtocart.quantity | multiply:addtocart.product.prodPrice}

    快速注意:您在添加到购物车时没有记录价格。这可能是某些手推车上的问题。取决于商店。

    我不会把它放在你的视图中,而是让它成为你模型下的一个函数。这样,如果您必须计算应用程序中其他地方的总数,则不必重复使用相同的代码

    真正的问题是您使用的模型不正确。用户只有一个购物车,而不是很多。因此,您应该使用以下模型:

    class Cart(models.Model):
        session = models.CharField(max_length=100)
    
    class CartItem(models.Model):
        cart = models.ForeignKey('Cart', related_name='items')
        product = models.ForeignKey('prod') 
        quantity = models.IntegerField()
    
    然后,将total函数添加到购物车模型中:

    class Cart(models.Model):
        session = models.CharField(max_length=100)
        items = models.ManyToManyField(prod, through="CartProduct")
    
        def total(self):
            total = 0.0
            for item in self.items.all():
                total += (item.product.prodPrice * item.quantity)
            return total
    

    我还郑重建议将prod模型重命名为Product,并重命名字段以匹配Django命名约定

    很抱歉听起来很傻,但我正在看更多的场景1,对我来说并不是那么简单(我处于非常初级的水平)。在my views.py中,我不确定要放置什么。您可以发布视图功能吗?这将使我更容易向您展示一个示例我在您的视图中任何地方都没有看到定义的userCart变量。如何将其传递到模板中?def userHistory(request):userCart=Cart.objects.filter(session=request.session.session_key[:20])返回render_to_response('Products/history.html',{'userCart':userCart})好的,请参阅我更新的答案。我假设Cart有一个名为“items”的多对多关系,所以如果不正确,您需要重命名它。如果您需要这方面的帮助,只需发布您的models.py文件,我很乐意看一看。
    class Cart(models.Model):
        session = models.CharField(max_length=100)
    
    class CartItem(models.Model):
        cart = models.ForeignKey('Cart', related_name='items')
        product = models.ForeignKey('prod') 
        quantity = models.IntegerField()
    
    class Cart(models.Model):
        session = models.CharField(max_length=100)
        items = models.ManyToManyField(prod, through="CartProduct")
    
        def total(self):
            total = 0.0
            for item in self.items.all():
                total += (item.product.prodPrice * item.quantity)
            return total