2012-04-25 2 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 я не уверен, что положить –

+0

Не могли бы вы опубликовать свою функцию просмотра?Это облегчит мне показать вам пример – cberner

+0

, отредактированный вверху, спасибо за помощь –

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.

Смежные вопросы