Как выполнить вложенный цикл в шаблоне Django на одном наборе запросов

Я хочу отобразить данные набора запросов на шаблоне со слайдером. Каждый слайдер будет содержать 3 запроса продуктов, как это enter image description here

Но я не могу сделать это динамически с помощью цикла for в языке шаблонов Django. Код моего шаблона выглядит следующим образом

<h4>Latest Products</h4>
                        <div class="latest-product__slider owl-carousel">
                            {% for product in recent_products %}
                                <div class="latest-prdouct__slider__item">
                                    <a href="#" class="latest-product__item">
                                        <div class="latest-product__item__pic">
                                            <img src="{{product.images.url}}" alt="">
                                        </div>
                                        <div class="latest-product__item__text">
                                            <h6>{{product.name}}</h6>
                                            <span>{{product.price}} Tk</span>
                                        </div>
                                    </a>
                                </div>
                            {% endfor %}

                        </div>

вот моя функция просмотра:

def index(request):
    products = Product.objects.all()
    categorys = ProductCategory.objects.all()

    today = timezone.now().date()
    last_day = today - timezone.timedelta(days=7)

    today = datetime.strftime(today, "%Y-%m-%d")
    last_day = datetime.strftime(last_day, "%Y-%m-%d")

    print(last_day)
    recent_products = Product.objects.filter(added_time__range=[last_day, today]).order_by("-added_time")
    context = {
        'products': products,
        'categorys': categorys,
        'recent_products': recent_products
    }
    return render(request, 'index.html', context)

и мой класс модели:

class ProductCategory(models.Model):
    name = models.CharField(max_length=100)
    image = models.ImageField(blank=True, null=True)
    added_time = models.DateTimeField(auto_now_add=True)
    updated_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.FloatField(blank=True, null=True)
    ratings = models.FloatField(blank=True, null=True)
    number_of_ratings = models.IntegerField(blank=True, null=True)
    images = models.ImageField(blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    # user_review need to be added
    discount_rate = models.IntegerField(default=0)
    available_stock = models.IntegerField(default=0)
    added_time = models.DateTimeField(auto_now_add=True)
    updated_time = models.DateTimeField(auto_now=True)
    category = models.ForeignKey(ProductCategory, on_delete=models.SET_NULL, null=True, blank=True)

    @property
    def discount(self):
        if self.discount_rate > 0:
            discounted_price = self.price - self.price * self.discount_rate / 100
            return discounted_price

Если ваше представление представляет кверисет, то оно будет статичным, если recent_products является кверисетом трех последних продуктов, то вы не можете изменить его таким образом. Я полагаю, есть два решения, которые вы могли бы реализовать:

  1. Если вы не хотите показывать все товары, то самый простой способ сделать это - сделать кверисет с ограничением, например, 12 товаров, затем создать слайдер с 9 скрытыми товарами в нем, и вы можете показывать/скрывать товары по требованию. Это все еще статичный вариант, но, возможно, он уже работает для вас. Проблема здесь в том, что в какой-то момент вам придется ограничить набор запросов. Если у вас много товаров и вам нужно загружать изображение для каждого из них, этот вариант не сработает.

    .
  2. Другое решение действительно динамическое, более эффективное, но и немного более сложное. Вы можете сделать ajax-запросы для слайдера товаров. Таким образом, ваше представление не будет представлять никаких продуктов вообще. Вы должны создать другое представление, которое будет работать с ajax-запросами и отправлять 3 продукта в соответствии с индексом страницы. Для этого потребуется некоторый javascript для выполнения запросов, замены продуктов и отслеживания текущей страницы. Преимуществом этого является то, что ваша страница будет загружаться быстрее, так как ей не нужно загружать все изображения и информацию о продуктах, которые могут быть никогда не видны, и вы можете позволить клиенту просмотреть все ваши продукты, если он захочет.

    .

В вашем views.py измените

today = timezone.now().date() в

today = timezone.now()

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