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

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

3 に答える 3

2

これを行うには2つの方法があります。

  1. ビューで合計を計算し、それを別の変数として渡します
  2. 乗算を行うカスタムテンプレートタグを定義します(Djangoにはデフォルトで1つありません)

(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を作成します(Pythonがパッケージであることを認識できるように、このディレクトリに__init __。pyファイルも配置します)

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

これをビューに入れる代わりに、モデルの下の関数にします。これにより、アプリの別の場所で合計を計算する必要がある場合に、同じコードを再利用する必要がなくなります。

本当の問題は、間違ったモデルを使用していることです。ユーザーが持っているショッピング カートは 1 つだけで、多くはありません。したがって、代わりに次のモデルを使用する必要があります。

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 関数を 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 に答える
0

簡単な注意: カートに追加した時点で価格を記録していません。これは、一部のカートで問題になる可能性があります。ショップによります。

于 2012-04-25T08:24:17.020 に答える