Как добавить мою галерею изображений в мой product.html в Django с представлением на основе классов DetailView

Я использую модель Product and Images. моя цель - отобразить на моей странице одного элемента галерею изображений, связанных с элементом, поступающих из изображений модели.

Как я могу изменить следующий код, чтобы фильтровать по слагу элемента и показывать только галерею, относящуюся к слагу.

Класс предмета

class Item(models.Model):
    title = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    image = models.ImageField(, upload_to='catalog/images/', blank=True)
    slug = models.SlugField()

Класс изображений

class Images(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    title = models.CharField(blank=True, max_length=50)
    image = models.ImageField(upload_to='catalog/images/', blank=True)

Детальный просмотр продукта

class ProductDetailView(DetailView):
    model = Item
    template_name = 'product.html'
    context_object_name = 'item'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['image_gallery'] = Images.objects.all()
        return context

страница product.html

<div class="row wow fadeIn">
        
        {% for img in image_gallery %}
          
        <div class="col-lg-4 col-md-12 mb-4">
          
          <img src="{{img.image.url}}" class="img-fluid" alt="">
          
        </div>

person Brioproject    schedule 20.12.2020    source источник
comment
@Crosby это решение показывает только 1 изображение в галерее. в базе товара есть 3 изображения. и я использую slug. как я могу убедиться, что все 3 фотографии отображаются в галерее?   -  person Brioproject    schedule 20.12.2020
comment
context['image_gallery'] = Images.objects.filter(item=self.object) должно работать, я думаю?   -  person Guillaume    schedule 20.12.2020
comment
Да! это работает, большое спасибо!   -  person Brioproject    schedule 20.12.2020
comment
@Brioproject Я написал это как ответ. Можете ли вы подтвердить это? Спасибо.   -  person Guillaume    schedule 20.12.2020


Ответы (2)


Вы можете получить доступ к экземпляру изображения с помощью self.object, тогда вам просто нужно отфильтровать изображения, которые вы хотите передать в представление с отношением внешнего ключа.

class ProductDetailView(DetailView):
    model = Item
    template_name = 'product.html'
    context_object_name = 'item'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['image_gallery'] = Images.objects.filter(item=self.object)
        return context
person Guillaume    schedule 20.12.2020

Вам нужно использовать .filter() не .get()

image = Images.objects.all()
image.image will give you the image

Это Django 3, вам нужно преобразовать его в любую версию, которую вы используете.

person IliasMh    schedule 20.12.2020