django 中的购物车会话
cart session in django
我使用会话创建购物车。
我有一个产品模型和一个 Variant 模型,我在 Variant 模型中为我的产品着色和调整尺寸。这样我就可以拥有不同颜色和尺寸以及不同价格的产品。
我用Session创建的购物车有问题。
我遇到的问题是,如果产品有 3 种不同的颜色,并且每种颜色都有不同的价格,我无法在购物车中显示价格,而且我不知道该怎么做。
我应该如何在模板中显示我的 Variant 模型的价格?
my Product model:
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
my Variant model:
class Variants(models.Model):
name = models.CharField(max_length=100)
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product_var',)
size = models.ForeignKey(Size, on_delete=models.CASCADE)
color = models.ForeignKey(Color, on_delete=models.CASCADE)
price = models.IntegerField(default=0)
my session cart :
CART_SESSION_ID = 'cart'
class Cart:
def __init__(self, request):
self.session = request.session
cart = self.session.get(CART_SESSION_ID)
if not cart:
cart = self.session[CART_SESSION_ID] = {}
self.cart = cart
def __iter__(self):
product_ids = self.cart.keys()
products = Product.objects.filter(id__in=product_ids)
cart = self.cart.copy()
for product in products:
cart[str(product.id)]['product'] = product
def add(self, product, quantity):
product_id = str(product.id)
if product_id not in self.cart:
self.cart[product_id] = {'quantity': 0, 'price': str(product.total_price)}
self.cart[product_id]['quantity'] += quantity
self.save()
def save(self):
self.session.modified = True
my view:
# show cart
def cart_details(request):
cart = Cart(request)
return render(request, 'cart/cart_details.html', {'cart': cart, })
# add to cart
def cart_add(request, product_id):
cart = Cart(request)
product = get_object_or_404(Product, id=product_id)
form = CartAddForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
cart.add(product=product, quantity=cd['quantity'])
return redirect('cart:details')
my template for show product in cart:
{% for c in cart %}
<tr>
<td>{{ c.product.name }}</td>
<td>{{ c.product.price }}</td> # my problem!!!
</tr>
{% endfor %}
从问题陈述中我看到,如果您在购物车而不是产品中存储变体,问题就会消失。
代码会变成这样:
class Cart:
def __init__(self, request):
self.session = request.session
cart = self.session.get(CART_SESSION_ID)
if not cart:
cart = self.session[CART_SESSION_ID] = {}
self.cart = cart
def __iter__(self):
variant_ids = self.cart.keys()
products = Variants.objects.filter(id__in=variant_ids)
cart = self.cart.copy()
for product in products:
cart[str(variant.id)]['variant'] = variant
def add(self, variant, quantity):
variant_id = str(variant.id)
if variant_id not in self.cart:
self.cart[variant_id] = {'quantity': 0, 'price': str(variant.price)}
self.cart[variant_id]['quantity'] += quantity
self.save()
def save(self):
self.session.modified = True
# add to cart
def cart_add(request, variant_id):
cart = Cart(request)
variant = get_object_or_404(Variant, id=variant_id)
form = CartAddForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
cart.add(variant=variant, quantity=cd['quantity'])
return redirect('cart:details')
template
{% for c in cart %}
<tr>
<td>{{ c.variant.name }}</td>
<td>{{ c.variant.price }}</td>
<td> color, etc.</td>
</tr>
{% endfor %}
您不再需要将产品存储在购物车中,因为变体与产品有关table。
我使用会话创建购物车。 我有一个产品模型和一个 Variant 模型,我在 Variant 模型中为我的产品着色和调整尺寸。这样我就可以拥有不同颜色和尺寸以及不同价格的产品。 我用Session创建的购物车有问题。 我遇到的问题是,如果产品有 3 种不同的颜色,并且每种颜色都有不同的价格,我无法在购物车中显示价格,而且我不知道该怎么做。 我应该如何在模板中显示我的 Variant 模型的价格?
my Product model:
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
my Variant model:
class Variants(models.Model):
name = models.CharField(max_length=100)
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product_var',)
size = models.ForeignKey(Size, on_delete=models.CASCADE)
color = models.ForeignKey(Color, on_delete=models.CASCADE)
price = models.IntegerField(default=0)
my session cart :
CART_SESSION_ID = 'cart'
class Cart:
def __init__(self, request):
self.session = request.session
cart = self.session.get(CART_SESSION_ID)
if not cart:
cart = self.session[CART_SESSION_ID] = {}
self.cart = cart
def __iter__(self):
product_ids = self.cart.keys()
products = Product.objects.filter(id__in=product_ids)
cart = self.cart.copy()
for product in products:
cart[str(product.id)]['product'] = product
def add(self, product, quantity):
product_id = str(product.id)
if product_id not in self.cart:
self.cart[product_id] = {'quantity': 0, 'price': str(product.total_price)}
self.cart[product_id]['quantity'] += quantity
self.save()
def save(self):
self.session.modified = True
my view:
# show cart
def cart_details(request):
cart = Cart(request)
return render(request, 'cart/cart_details.html', {'cart': cart, })
# add to cart
def cart_add(request, product_id):
cart = Cart(request)
product = get_object_or_404(Product, id=product_id)
form = CartAddForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
cart.add(product=product, quantity=cd['quantity'])
return redirect('cart:details')
my template for show product in cart:
{% for c in cart %}
<tr>
<td>{{ c.product.name }}</td>
<td>{{ c.product.price }}</td> # my problem!!!
</tr>
{% endfor %}
从问题陈述中我看到,如果您在购物车而不是产品中存储变体,问题就会消失。
代码会变成这样:
class Cart:
def __init__(self, request):
self.session = request.session
cart = self.session.get(CART_SESSION_ID)
if not cart:
cart = self.session[CART_SESSION_ID] = {}
self.cart = cart
def __iter__(self):
variant_ids = self.cart.keys()
products = Variants.objects.filter(id__in=variant_ids)
cart = self.cart.copy()
for product in products:
cart[str(variant.id)]['variant'] = variant
def add(self, variant, quantity):
variant_id = str(variant.id)
if variant_id not in self.cart:
self.cart[variant_id] = {'quantity': 0, 'price': str(variant.price)}
self.cart[variant_id]['quantity'] += quantity
self.save()
def save(self):
self.session.modified = True
# add to cart
def cart_add(request, variant_id):
cart = Cart(request)
variant = get_object_or_404(Variant, id=variant_id)
form = CartAddForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
cart.add(variant=variant, quantity=cd['quantity'])
return redirect('cart:details')
template
{% for c in cart %}
<tr>
<td>{{ c.variant.name }}</td>
<td>{{ c.variant.price }}</td>
<td> color, etc.</td>
</tr>
{% endfor %}
您不再需要将产品存储在购物车中,因为变体与产品有关table。