【发布时间】:2021-06-06 18:41:56
【问题描述】:
是否可以在 Django 模板过滤器中添加 cart_obj 请求
我目前在我的模板标签中有:
@register.filter
def existing_product(product):
return CartItem.objects.filter(item_id=product.id).exists()
在我的模板中:
{% if product|existing_product %}
{% endif %}
唯一的问题是这个过滤器只能找到等于 product.id 的 item_id ,我希望能够添加一个额外的过滤器来查找 cart_obj 中的 item_id。
views.py
cart_obj, new_obj = Cart.objects.new_or_get(request)
基本上我的模板标签是这样的:
return CartItem.objects.filter(item_id=product.id, items_cart_id=cart_obj).exists()
添加了过滤“items_cart_id”,但我不确定如何执行此操作以及在模板“if”条件中放入什么。
class CartManager(models.Manager):
def new_or_get(self, request):
cart_id = request.session.get("cart_id", None)
qs = self.get_queryset().filter(id=cart_id)
if qs.count() == 1:
new_obj = False
cart_obj = qs.first()
if request.user.is_authenticated and cart_obj.user is None:
cart_obj.user = request.user
cart_obj.save()
else:
cart_obj = Cart.objects.new(user=request.user)
new_obj = True
request.session['cart_id'] = cart_obj.id
return cart_obj, new_obj
def new(self, user=None):
user_obj = None
if user is not None:
if user.is_authenticated:
user_obj = user
return self.model.objects.create(user=user_obj)
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)
class Cart(models.Model):
user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
subtotal = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = CartManager()
有什么想法吗? 谢谢
【问题讨论】:
-
您能详细描述一下您真正想要实现的目标吗?我认为这很容易做到,但我不太确定你打算在这里做什么
-
我想检查用户购物车中是否存在产品,如果存在则显示删除按钮,否则显示添加到购物车按钮,目前我拥有的过滤器检查产品是否存在,无论用户如何.我正在使用模板标签,但不知道如何在该过滤器中添加此 cart_obj 请求。
-
您能否介绍一下您的购物车到用户分配机制(如果它连接到会话或只是连接到连接)。它将帮助我提出答案
-
我添加了 cartmanager 模型
-
请附上您的
Cart和CartItem模型我真的看不到Cart 和CartItem 之间的关系类型,所以请把它们粘贴在这里。我可以看到你几个月前开始使用 Django,但它仍然需要一些改进。
标签: django django-views django-templates