Как выполнить вложенный цикл в шаблоне Django на одном наборе запросов
Я хочу отобразить данные набора запросов на шаблоне со слайдером. Каждый слайдер будет содержать 3 запроса продуктов, как это 
Но я не могу сделать это динамически с помощью цикла 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 является кверисетом трех последних продуктов, то вы не можете изменить его таким образом. Я полагаю, есть два решения, которые вы могли бы реализовать:
Если вы не хотите показывать все товары, то самый простой способ сделать это - сделать кверисет с ограничением, например, 12 товаров, затем создать слайдер с 9 скрытыми товарами в нем, и вы можете показывать/скрывать товары по требованию. Это все еще статичный вариант, но, возможно, он уже работает для вас. Проблема здесь в том, что в какой-то момент вам придется ограничить набор запросов. Если у вас много товаров и вам нужно загружать изображение для каждого из них, этот вариант не сработает.
.Другое решение действительно динамическое, более эффективное, но и немного более сложное. Вы можете сделать ajax-запросы для слайдера товаров. Таким образом, ваше представление не будет представлять никаких продуктов вообще. Вы должны создать другое представление, которое будет работать с ajax-запросами и отправлять 3 продукта в соответствии с индексом страницы. Для этого потребуется некоторый javascript для выполнения запросов, замены продуктов и отслеживания текущей страницы. Преимуществом этого является то, что ваша страница будет загружаться быстрее, так как ей не нужно загружать все изображения и информацию о продуктах, которые могут быть никогда не видны, и вы можете позволить клиенту просмотреть все ваши продукты, если он захочет.
.
В вашем views.py измените
today = timezone.now().date() в
today = timezone.now()