2012-04-25 94 views
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}}*** 

views.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}) 

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

回答

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}}

+0

對不起聽起來啞巴,但我更多地看情況1,它不是直截了當(我在一個非常初學者水平)。在我的views.py裏面,我不確定要放什麼 – 2012-04-25 04:08:45

+0

你可以發佈你的視圖功能嗎?這會讓我更容易向您展示 – cberner 2012-04-25 04:18:11

+0

頂部的編輯示例,感謝您的幫助 – 2012-04-25 04:29:58

0

快速提示:您不會在購物車購買時記錄價格。這可能是一些購物車的問題。取決於商店。

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

然後,你總函數添加到購物車型號:

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 

我還嚴重推薦重命名督促模型到產品和重命名等領域以及匹配Django命名約定。