Я хочу проверить, существуют ли продукты в корзине, а затем показать добавленный значок на веб-странице, используя django и jinja - PullRequest
0 голосов
/ 02 августа 2020

У меня есть страница с одним продуктом, на которой у меня есть кнопка «Добавить в корзину», но если этот продукт уже существует в корзине, я хочу вместо этого показать значок «Добавлен в корзину». Я не могу найти способ проверить это. Вот мой models.py

class Order(models.Model):
    customer=models.ForeignKey(Customer,on_delete=models.SET_NULL,null=True,blank=True)
    date_ordered=models.DateTimeField(auto_now_add=True)
    complete=models.BooleanField(default=False,null=True,blank=False)
    transaction_id=models.CharField(max_length=100,null=True)
class OrderItem(models.Model):
    product=models.ForeignKey(Product,on_delete=models.SET_NULL,null=True)
    order=models.ForeignKey(Order,on_delete=models.SET_NULL,null=True)
    quantity=models.IntegerField(default=0,null=True,blank=False)
    date_added=models.DateTimeField(auto_now_add=True)
class Product(models.Model):
    category = models.ForeignKey(Category, on_delete = models.CASCADE)
    productid=models.CharField(max_length=30)
    name=models.CharField(max_length=30)

А вот мой views.py

def singleproduct(request, id):
context = {
    'types': Category.objects.all(),
    'prods': Product.objects.filter(productid = id),
    'in_cart': False,
}
if request.user.is_authenticated:
    order = Order.objects.get_or_create(customer=request.user.customer, complete=False)[0]
    context['in_cart'] = order.products.filter(product_id=id).exists()
return render(request,"singleproduct.html", context)    

def cart(request):
        customer=request.user.customer
        order, created=Order.objects.get_or_create(customer=customer, complete=False)
        items=order.orderitem_set.all()
        context={
            'items':items,
            'order':order
        }
        return render(request,"cart.html",context)


def category(request):
context = {
    'types' : Category.objects.all(),
    'prods': Product.objects.filter(),
    'cartItems':[],
    'in_cart': False,
    
}
if request.user.is_authenticated:
    customer=request.user.customer
    order, created=Order.objects.get_or_create(customer=customer, complete=False)
    cartItems=order.get_cart_items,     
    items=order.orderitem_set.all()
    context['in_cart'] =order.orderitem_set.filter(product__productid=id).exists()    
return render(request,"category.html",context)

А вот мой html код для этой кнопки

 {% if user.is_authenticated %}
{% if in_cart %}
<button data-product={{product.id}} data-action="add"
class="btnabc btnabc-warning update-cart">Added</button>
 {% else %}
<button data-product={{product.id}} data-action="add"
class="btnabc btnabc-warning update-cart">Add to Cart</button>
{% endif %}
 {% else %}
<button class="btnabc btnabc-warning"><a href="/login/">Add to
Cart</a></button>
{% endif %}

Но похоже, что он не работает, даже если продукта нет в корзине, он показывает Добавлено. Пожалуйста, предложите мне способ, чтобы в моем html коде Я могу проверить, есть ли товар в корзине или нет, и отобразить соответствующие кнопки. Любая помощь будет принята.

1 Ответ

2 голосов
/ 02 августа 2020
if request.user.is_authenticated:
    customer=request.user.customer
    order, created=Order.objects.get_or_create(customer=customer, complete=False)
    items=order.orderitem_set.all()
    cartItems=order.get_cart_items
    types = Category.objects.all()
    prods= Product.objects.filter(productid = id)

    # filter the oder by the product_id , and return True if exsits
    in_cart = order.orderitem_set.filter(product__productid=id).exists()

else:
    types = Category.objects.all()
    prods= Product.objects.filter(productid = id)
    cartItems=[]

    # default False
    in_cart = False

# no forget to add in context
return render(request,"singleproduct.html", {'types':types,'prods':prods, 'in_cart': in_cart})

in html:

    {% if in_cart %}
        already in cart
    {% else %}
        Add in cart
    {% endif %}

edit: вы можете оптимизировать ваш вид вот так, точка точно такая же

def singleproduct(request, id):
    context = {
        'types': Category.objects.all(),
        'prods': Product.objects.filter(productid = id),
        'in_cart': False,
    }
    if request.user.is_authenticated:
        order = Order.objects.get_or_create(customer=request.user.customer, complete=False)[0]
        context['in_cart'] = order.orderitem_set.filter(product__productid=id).exists()
    return render(request,"singleproduct.html", context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...