如何过滤模型 Django 并与 id 进行比较

时间:2021-06-04 16:49:24

标签: django django-models django-views django-templates

我正在尝试过滤一个名为 "CartItem" 的模型,它有一个名为 item 的字段,我想检查产品 ID 是否在该字段中。每个cartitem 实例都连接到一个cart.id。产品 ID 取自模板中的表单。

我目前在模板中有“{% if caritem.objects.filter(item_id=product_id).exists %}”,我还尝试在 views.py 中制作一个项目列表,以尝试使用“if in " 模板中的语句,基于“项目”内容,唯一的问题是当浏览器刷新时,不会调用 for 循环来创建此列表,只有在用户单击“添加到购物车”时才会调用它按钮。希望这是有道理的。

目前我收到一个错误: 模板语法错误 异常值:
无法解析剩余部分:'(item.id=product.id).exists' from 'cartitem.objects.filter(item.id=product.id).exists'

谢谢

models.py

class CartItem(models.Model):
    item        = models.ForeignKey(Product, blank=True, on_delete=models.CASCADE, null=True)
    items_cart  = models.ForeignKey('Cart', blank=True, on_delete=models.CASCADE, null=True)
    quantity    = models.IntegerField(null=True, blank=True)
    updated     = models.DateTimeField(auto_now=True)
    timestamp   = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return 'item:{} cart:{} quantity:{}'.format(self.item, self.items_cart, self.quantity) 

views.py

def cart_update(request):
    product_id = request.POST.get('product_id')
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    cart_items = CartItem.objects.filter(items_cart_id=cart_obj)
    items = [] 
    for item in cart_items:
        items.append(item.item.id)
    print(items)

    if product_id is not None:
        try:
            product_obj = Product.objects.get(id=product_id)

        except Product.DoesNotExist:
            print("Show message to user, product is gone?")
            return redirect("cart:home")
        cart_obj, new_obj = Cart.objects.new_or_get(request)
        cart_items = CartItem.objects.filter(items_cart_id=cart_obj)
        if product_obj in cart_items:
            cart_items.delete(product_obj)
            added = False
        else:
            newitem = CartItem(item=product_obj, items_cart=cart_obj, quantity=1)
            newitem.save()
            added = True
        request.session['cart_items'] = cart_items.count()
        # return redirect(product_obj.get_absolute_url())
        if request.is_ajax(): # Asynchronous JavaScript And XML / JSON
            print("Ajax request")
            json_data = {
                "added": added,
                "removed": not added,
                "cartItemCount": cart_items.count()
            }
            return JsonResponse(json_data, status=200) # HttpResponse
            # return JsonResponse({"message": "Error 400"}, status=400) # Django Rest Framework
    return redirect("cart:home")

购物车.html

<form class='form-product-ajax' method='POST' action='{% url "cart:update" %}' data-endpoint='{% url "cart:update" %}' class="form" {% if request.user.is_authenticated %}data-user='abc'{% endif %}> {% csrf_token %}
    <input type='hidden' name='product_id' value='{{ product.id }}' {% if  product.is_digital %}data-is-digital='true'{% endif %}/>
      <span class='submit-span'>

    {% if cartitem.objects.filter(item_id=product_id).exists %}
        <div class='btn-group'> <a class='btn btn-link' href='/cart/'>In cart</a> <button type='submit' class='btn btn-link'>Remove?</button></div>
    {% else %}
        <button type='submit' class='btn btn-success'>Add to cart</button>
    {% endif %}

    </span>
</form>

1 个答案:

答案 0 :(得分:1)

你不能在模板 django 中使用这个语法:

cartitem.objects.filter(item.id=product.id).exists

您可以使用 templatetags 并在您的模板中调用它:

register = template.Library()

@register.filter
def existing_product(product):
    return CartItem.objects.filter(item.id=product.id).exists()

然后在您的模板中加载您的模板标签

{% load file_name_containing_your_method %}


<form class='form-product-ajax' method='POST' action='{% url "cart:update" %}' data-endpoint='{% url "cart:update" %}' class="form" {% if request.user.is_authenticated %}data-user='abc'{% endif %}> {% csrf_token %}
    <input type='hidden' name='product_id' value='{{ product.id }}' {% if  product.is_digital %}data-is-digital='true'{% endif %}/>
      <span class='submit-span'>

    {% if product|existing_product %}
        <div class='btn-group'> <a class='btn btn-link' href='/cart/'>In cart</a> <button type='submit' class='btn btn-link'>Remove?</button></div>
    {% else %}
        <button type='submit' class='btn btn-success'>Add to cart</button>
    {% endif %}

    </span>
</form>

希望对你的第二个问题有所帮助

注意:添加模板标签后应该重启服务器