首页 > 解决方案 > 如何过滤模型 Django 并与 id 进行比较

问题描述

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

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

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

谢谢

模型.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) 

视图.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>

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


您不能在模板 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>

希望这可以帮助你的第二个问题

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


推荐阅读