django - 如何过滤模型 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>
解决方案
您不能在模板 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>
希望这可以帮助你的第二个问题
注意:您应该在添加模板标签后重新启动服务器
推荐阅读
- django - 无法使用 url 模式重定向
- mysql - 在 gorm 中比较时间:time.Time 或字符串
- android - 带有复选框和自定义适配器的 ListView,片段无法正常工作
- excel - 向柱形图添加额外的数据标签
- r - 准二项分布 (QBD) 的分位数比较图
- java-8 - 将比较器传递到带有收集器的地图中
- php - EasyAdminBundle NumberField 是舍入纬度和经度小数
- ruby-on-rails - Rails - 参数形式值
- linux-device-driver - 如何通过 I2C 发送 IPMI 命令?
- r - 如何制作 ggplot2 趋势线,一条虚线,另一条实线?