【问题标题】:why isn't it being displayed properly?为什么不能正确显示?
【发布时间】:2020-03-28 07:49:02
【问题描述】:

我目前正在开发一个在线商店,人们可以在其中将产品添加到购物车中。在我的主页 html 文件中,如果产品未添加到购物车,我想显示按钮“添加到购物车”,如果添加了产品,则显示“从购物车中删除”按钮。但它不能正常工作。我现在得到“从购物车中删除”按钮。 我的 index.html:

{% extends 'base.html' %} 

{% block content %}
    <h1>Products</h1>
    <div class="container-md">
        <div class="row">
            {% for product in products %}
                <div class="col">
                    <div class="card-deck" style="width: 18rem;">
                      <img src="{{ product.image_url }}" class="card-img-top" alt="...">
                      <div class="card-body">
                        <a class="card-title" href="{% url 'detail-view' product.slug %}">{{ product.name }}</a>
                        <p class="card-text">${{ product.price }}</p>
                        {% if product in Cart.products.all %}
                            <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Add to Cart</a>
                        {% else %}
                            <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Remove from Cart</a> 
                        {% endif %}

                      </div>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
{% endblock %}

我的购物车views.py:

from django.shortcuts import render, redirect, HttpResponseRedirect
from products.models import Product
from .models import Cart
from django.contrib import messages
from django.urls import reverse


def cart(request):
    cart = Cart.objects.all()[0]
    context = {"cart":cart}
    template = 'shopping_cart/cart.html'
    return render(request, template, context)


def add_to_cart(request, slug):
    cart = Cart.objects.all()[0]
    try:
        product = Product.objects.get(slug=slug)
    except Product.DoesNotExist:
        pass
    except:
        pass 
    if not product in cart.products.all():
        cart.products.add(product)
        messages.success(request, f'Product added to cart')
        return redirect('myshop-home')
    else:
        cart.products.remove(product)
        messages.success(request, f'Product removed from cart')
        return redirect('myshop-home')

    new_total = 0.00
    for item in cart.products.all():
        new_total += float(item.price)

    cart.total = new_total
    cart.save()


    return HttpResponseRedirect(reverse('cart'))

我的购物车的models.py:

from django.db import models
from products.models import Product


class Cart(models.Model):
    products = models.ManyToManyField(Product, null=True, blank=True)
    total = models.DecimalField(max_digits=100, decimal_places=2, default = 0.00)

    def __unicode__(self):
        return "Cart"

【问题讨论】:

  • 你能分享你的模型吗?
  • 我添加了购物车的 models.py

标签: python html django


【解决方案1】:

而不是:

{% if product in Cart.products.all %}
      <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Add to Cart</a>
{% else %}
     <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Remove from Cart</a> 
{% endif %}

你可以这样试试:

{% if not product.cart_set.exists %}
     <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Add to Cart</a>
{% else %}
     <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Remove from Cart</a> 
{% endif %}

我正在使用reverse relation 检查该产品是否存在任何购物车。但它会检查该产品是否在任何购物车中。这不应该是正确的,因为它应该检查产品是否在特定的购物车中。

现在,如果您想更具体地确定该产品是否存在于某个购物车中,我建议您在视图中进行此计算。例如,在您的产品视图中,您可以这样做:

from django.db.models import Case, When, Value, BooleanField

cart = Cart.objects.first()

products = Product.objects.annotate(in_cart=Case(When(cart__pk=cart.id,then=Value(True)),default=Value(False),output_field=BooleanField()))

return render(request, template.html, context={'products':products})

并签入模板:

{% if not product.in_cart %}
          <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Add to Cart</a>
{% else %}
         <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Remove from Cart</a> 
{% endif %}

我在这里使用 django 的conditional expression 来检查产品是否在某个购物车中。

也许您的代码中出现了更简单的错误:

if else 逻辑中添加not

{% if not product in Cart.products.all %}
      <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Add to Cart</a>
{% else %}
     <a href="{% url 'add-to-cart' product.slug %}" class="btn btn-primary">Remove from Cart</a> 
{% endif %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2020-06-28
    • 2012-04-13
    • 2013-07-07
    相关资源
    最近更新 更多