Когда я фильтрую продукт, но когда я запускаю проект, я не получаю изображения.

Когда я фильтрую продукт, но когда я запускаю проект, я не получаю изображения

Если я изменю 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[] продуктов (список продуктов)

поэтому, если вы хотите обработать несколько продуктов, используйте второй способ, но если вы хотите обработать один единственный продукт, используйте первый способ

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