Как в шаблонизаторе Jinja правильно вывести данные в шаблон (несколько фотографий к одной машине)

Рейтинг: 0Ответов: 1Опубликовано: 22.05.2023

Пишу сайт на Django4 по продаже битых автомобилей. На главной странице делаю список лотов. В каждом лоте есть слайдер с фотками.

В базе реализована связь "один ко многим" (один автомобиль имеет множество фото).

models.py

class Car(models.Model):
    Name_car_owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Имя')
    Name_car_brand = models.ForeignKey('brand', on_delete=models.PROTECT, verbose_name='Марка')
    Сar_body_type = models.ForeignKey('body_type', on_delete=models.PROTECT, verbose_name='Тип кузова')
    Сar_model = models.ForeignKey('model', on_delete=models.PROTECT, verbose_name='Модель')
    Сar_years = models.DateField(verbose_name='Дата выпуска')
    Car_state = models.ForeignKey('state', on_delete=models.PROTECT, verbose_name='Состояние', null=True)
    transmission = models.ForeignKey('transmission', on_delete=models.PROTECT, verbose_name='Трансмиссия')
    Car_contry = models.ForeignKey('contry', on_delete=models.PROTECT, verbose_name='Страна')
    Car_city = models.ForeignKey('city', on_delete=models.PROTECT, verbose_name='Город')
    Car_drive_unit = models.ForeignKey('drive_unit', on_delete=models.PROTECT, verbose_name='Привод')
    Сar_description = models.TextField(max_length=1000, verbose_name='Описание')
    Сar_engine = models.ForeignKey('engine', on_delete=models.PROTECT, verbose_name='Двигатель')
    Сar_price = models.CharField(max_length=1000, verbose_name='Цена')

    def __str__(self):
        Car_ID = str(self.id)
        return Car_ID

    def get_absolute_url(self):
        return reverse('lot', kwargs={'post_id': self.pk})

    class Meta:
        verbose_name = 'Машина'
        verbose_name_plural = 'Машины'
        ordering = ['id']

class photo_car(models.Model):
    car_link = models.ForeignKey(Car, on_delete=models.CASCADE, verbose_name='Лот', related_name='images')
    car_photo = models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото')

    def __str__(self):
        #car_link = int(self.car_link)
        return self.car_link

    class Meta:
        verbose_name = 'Фото автомобиля'
        verbose_name_plural = 'Фотографии машин'
        ordering = ['id']

Вопрос: Как написать представление в views.py чтобы обращаясь к модели Car можно было подтянуть зависимости из photo_car и потом с помощью шаблонизатора Jinja2 в шаблоне вывести одну машину и все ее фотки?

Ответы

▲ 0Принят

Возможно это костыль но я решил проблему следующим образом:

  1. Получаем нужную машину в качестве объекта:

  2. Из таблицы с фотками запрашиваем только те фотки у которых FK = ID полученной машины:

  3. Далее распихиваем данные по контекстному словарю и отдаем шаблон с данными:

views.py

def show_lot(request, post_id):
    lot = Car.objects.filter(id=post_id)
    PhotoLot = photo_car.objects.filter(car_link=post_id)
    #print('---------------', PhotoLot.car_link)
    context = {
        'title': lot[0].Name_car_brand,
        'post': lot[0],
        'photo': PhotoLot
    }
    return render(request, 'car/lot.html', context=context)
  1. Далее в коде шаблона (в котором мы показываем конкретную машину) нужно перебрать набор фоток и все. На шаблон придут данные которые только к одной машине, левых данных там просто нет.