Фильтр в шаблоне, если товар находится в списке желаний или нет. Сайт электронной коммерции на Django

У меня возник вопрос по поводу django-шаблонов. Мне интересно, можно ли добавить фильтр в django-шаблон. Я хочу знать, находится ли товар в списке желаний или нет во время рендеринга. Итак, как мы можем узнать, находится ли он в списке желаний или нет? views.py

def store(request):
    data = cartData(request)

    cartItems = data['cartItems']
    order = data['order']
    items = data['items']
    categories = Category.objects.all()
    products = Product.objects.all()
    if request.user.is_authenticated:
        user=request.user
        wishedProducts = Wishlist.objects.filter(user=user)
    else:
        wishedProducts = {}

    """popularnye = Product.objects.filter(popularnye=True)"""
    context = {'products':products, 'cartItems':cartItems, 'order':order, 'items':items, 'categories':categories,'wishedProducts':wishedProducts}
    return render(request, 'store/store.html', context)

models.py

class Wishlist(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, verbose_name="Название товара",null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        unique_together = (
            ('user', 'product'),
        )
        verbose_name = 'Избранные'
        verbose_name_plural = "Избранные"

    def __str__(self):
        return str(self.product)

template

    {% for product in products %}
                      <div class="store col-lg-3 col-6">
                        <div class="single-product">
                          <div class="single-product">
  <div class="header-single-product">
  <p style="margin-top:-10px;margin-bottom:-10px" class="code">Код: 51265</p>
  {% if product in wishedProducts.product %}
  <i class="bi bi-heart-fill addWishlist" style="color: red" data-product="{{product.id}}" data-action="add"></i>
  {% else %}
  <i class="bi bi-heart addWishlist"  data-product="{{product.id}}" data-action="add"></i>
  {% endif %}
    <i class="fa fa-balance-scale" style="margin-right:5px;"></i>

........

Я решил эту проблему, создав еще один список с продуктами из wishlist. views.py

if request.user.is_authenticated:
        user=request.user
        wishedProducts = Wishlist.objects.filter(user=user)
        wishedProductsList = []
        for i in wishedProducts:
            wishedProductsList.append(i.product)
        count = Wishlist.objects.filter(user=user).count()
        
    else:
        wishedProducts = {}
        wishedProductsList={}

template

{% for product in products %}
                      <div class="store col-lg-3 col-6">
                        <div class="single-product">
                          <div class="single-product">
  <div class="header-single-product">
  <p style="margin-top:-10px;margin-bottom:-10px" class="code">Код: 51265</p>
  {% if product in wishedProductsList %}
  <i class="bi bi-heart-fill addWishlist" style="color: red" data-product="{{product.id}}" data-action="add"></i>
  {% else %}
  <i class="bi bi-heart addWishlist"  data-product="{{product.id}}" data-action="add"></i>
  {% endif %}
    <i class="fa fa-balance-scale" style="margin-right:5px;"></i>

Вы можете получить продукцию с:

def store(request):
    data = cartData(request)

    cartItems = data['cartItems']
    order = data['order']
    items = data['items']
    categories = Category.objects.all()
    products = Product.objects.all()
    if request.user.is_authenticated:
        wishedProducts = Product.objects.filter(wishlist__user=request.user)
    else:
        wishedProducts = Product.objects.none()

    context = {'products':products, 'cartItems':cartItems, 'order':order, 'items':items, 'categories':categories,'wishedProducts':wishedProducts}
    return render(request, 'store/store.html', context)

Это позволит получить все Product в списке пожеланий в одном запросе, и таким образом избежать проблемы N+1.

Вернуться на верх