0

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

{% 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}}***

视图.py

def addtocart(request, prod_id):
        if (request.method == 'POST'):
                form = CartForm(request.POST)
                if form.is_valid():
                        newComment = form.save()
                        newComment.session = request.session.session_key[:20]
                        newComment.save()
                        return HttpResponseRedirect('/products/' + str(newComment.product.id))
        else:
                form = CartForm( {'name':'Your Name', 'session':'message', 'product':prod_id} )

        return render_to_response('Products/comment.html', {'form': form, 'prod_id': prod_id})

def userHistory(request):
        userCart = Cart.objects.filter(session = request.session.session_key[:20])
        return render_to_response('Products/history.html', {'userCart':userCart})

模型.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')
4

3 回答 3

2

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

  1. 计算视图中的总数,并将其作为单独的变量传递
  2. 定义一个做乘法的自定义模板标签(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})

然后在您的模板中: <p>{{totalCost}}</p>

(2) 更详细:

首先新建一个文件my_app/templatetags/my_tags.py(还要在这个目录下放一个__init__.py文件,让Python知道它是一个包)

from django import template
register = template.Library()

@register.filter 
def multiply(arg1, arg2): 
    return float(arg1) * float(arg2)

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

于 2012-04-25T03:58:12.103 回答
0

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

于 2012-04-25T08:24:17.020 回答
0

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

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

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()

然后,将总函数添加到 Cart 模型:

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 命名约定。

于 2012-09-12T19:10:03.843 回答