Когда я фильтрую продукт, но когда я запускаю проект, я не получаю изображения.
Когда я фильтрую продукт, но когда я запускаю проект, я не получаю изображения
Если я изменю Product.objects.filter(slug=slug)
Чтобы заменить Product.objects.get(slug=slug) я сталкиваюсь с такой ошибкой
Объект Django 'Product' не является итерируемым
Views.py
def product_detail(request, slug):
try:
product = Product.objects.filter(slug=slug)
context = {
'product': product,
}
return render(request, 'buyer/product_details.html', context)
except Product.DoesNotExist:
return render(request, 'buyer/product_details.html', {'error': 'No data found.'})
URLs.py
path('product/<slug:slug>', views.product_detail, name="product_detail"),
Models.py
class Product(models.Model):
total_quantity = models.IntegerField()
availability = models.IntegerField()
feature_image = models.ImageField(upload_to='media/Product_image')
product_name = models.CharField(max_length=100)
price = models.IntegerField()
discount = models.IntegerField()
product_information = RichTextField()
model_name = models.CharField(max_length=100)
categories = models.ForeignKey(MainCategory, on_delete=models.CASCADE)
tags = models.CharField(max_length=100)
description = RichTextField()
section = models.ForeignKey(Section, on_delete=models.DO_NOTHING)
slug = models.SlugField(default='', max_length=500, null=True, blank=True)
def __str__(self):
return self.product_name
def get_absolute_url(self):
from django.urls import reverse
return reverse("product_detail", kwargs={'slug': self.slug})
class Meta:
db_table = "buyer_Product"
def create_slug(instance, new_slug=None):
slug = slugify(instance.product_name)
if new_slug is not None:
slug = new_slug
qs = Product.objects.filter(slug=slug).order_by('-id')
exists = qs.exists()
if exists:
new_slug = "%s-%s" % (slug, qs.first().id)
return create_slug(instance, new_slug=new_slug)
return slug
def pre_save_post_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
pre_save.connect(pre_save_post_receiver, Product)
class ProductImage(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
image_url = models.ImageField(upload_to='media/Product_image')
def __str__(self):
return self.product.product_name
HTML-страница
<div class="product-image-slider">
{% for i in product.productimage_set.all %}
<figure class="border-radius-10">
<img src="{{ i.image_url }}" alt="product image"/>
</figure>
{% endfor %}
</div>
<!-- THUMBNAILS -->
<div class="slider-nav-thumbnails">
{% for i in product.productimage_set.all %}
<div><img src="{{ i.image_url }}" alt="product image"/></div>
{% endfor %}
</div>
</div>
<!-- End Gallery -->
Вам необходимо пройти .url
{% for i in product.productimage_set.all %}
<figure class="border-radius-10">
<img src="{{ i.image.url }}" alt="product image"/>
</figure>
{% endfor %}
это потому что:
Product.objects.get(slug=slug) возвращает единственный объект типа porduct. а один единственный объект не является итерируемым
и
Product.objects.filter(slug=slug) возвращает Queryset[] продуктов (список продуктов)
поэтому, если вы хотите обработать несколько продуктов, используйте второй способ, но если вы хотите обработать один единственный продукт, используйте первый способ