почему он не отображается должным образом? - PullRequest
0 голосов
/ 28 марта 2020

В настоящее время я разрабатываю интернет-магазин, где люди могут добавлять товары в тележки. В моем домашнем файле html я хочу отобразить кнопку «Добавить в корзину», если продукт не добавлен в корзину, и «Удалить из корзины», если продукт добавлен. Но это не работает должным образом. Теперь я получаю кнопку «Удалить из корзины». Мой индекс. 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"
моей корзины.

1 Ответ

1 голос
/ 28 марта 2020

Вместо:

{% 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 для проверки если существует какая-либо корзина для этого продукта. Но он проверяет, есть ли этот продукт в любой корзине. Что не должно быть правильным, потому что оно должно проверять, находится ли продукт в указанной c корзине.

Теперь, если вы хотите быть более точным c, если этот продукт существует в определенной корзине, я Рекомендую сделать этот расчет в представлениях. Например, в представлении продукта вы можете сделать это следующим образом:

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 логи c:

{% 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...