【问题标题】:request cart_obj in template tag filter Django在模板标签过滤器Django中请求cart_obj
【发布时间】: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 模型
  • 请附上您的CartCartItem 模型我真的看不到Cart 和CartItem 之间的关系类型,所以请把它们粘贴在这里。我可以看到你几个月前开始使用 Django,但它仍然需要一些改进。

标签: django django-views django-templates


【解决方案1】:

检查当前商品 (DetailView) 是否在用户购物车中的代码如下所示。
在您的 User 模型上添加一个方法(或者 Cart 如果您不想与内置的 User 混淆)

class Cart(...):
...

def contains_item(self, item):
    # check if there exists a CartItem 
    # instance that hold a relation with given item
    return self.cart_item_set().filter(item=item).exists()

如果给定的商品在给定的购物车中,这将返回,因此您的模板标签应如下所示

@register.filter
def contains_item(cart, product):
    return cart.contains_item(product)

并在模板中调用它

{{ cart_obj|contains_item:product }}

【讨论】:

  • 我试过了,但它返回错误:'AnonymousUser' 对象没有属性'has_in_cart'
  • 是否可以在模板中执行类似 {% if product|existing_product with cart_obj %} 之类的操作,我知道这行不通,但我如何将额外的 cart_obj 添加到 if 语句中,如果可能吗?
  • @mac95782 难怪 - 这只是代码的一个示例,只需将 if not user.is_authenticated(): return False 添加到过滤器 - 堆栈不是“请为我做,我会复制粘贴它”自己想并阅读文档
  • @mac95782 并回答你的问题,不,这不可能 - 这甚至不是 with 语句在 python 中的工作方式。要做到这一点“你的方式”做回答编辑
  • 感谢您的努力,它还有一些修复工作要做,但我会阅读更多内容?
猜你喜欢
  • 2013-03-16
  • 2020-02-16
  • 1970-01-01
  • 2017-05-17
  • 2011-09-30
  • 2011-08-01
  • 1970-01-01
  • 2022-01-22
  • 2016-07-06
相关资源
最近更新 更多