簡體   English   中英

如何過濾 model Django 並與 id 進行比較

[英]How to filter a model Django and compare against an id

我正在嘗試過濾一個名為“CartItem”的 model,它有一個名為 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>

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

希望這可以幫助你的第二個問題

注意:您應該在添加模板標簽后重新啟動服務器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM