Django Передача более сложных типов python в шаблон

Я создаю веб-приложение для автомобильного магазина, используя Django. Вот мое представление индекса:

def index(request):
    cars = Car.objects.filter(brand=request.user.preferred_brand)
    return TemplateResponse(request, "main/home.html", {"cars": cars})

Это показывает список всех автомобилей, для которых аутентифицированный пользователь установил предпочтение.

В моей базе данных также есть следующая модель:

class Interest(models.Model):
    repair_company_name = models.CharField(max_length=200)
    car_id = models.IntegerField()

У каждого автомобиля есть набор компаний, которые готовы оказать ремонтную поддержку для конкретного автомобиля. Я хотел бы показать эту информацию и на домашней странице пользователя - чтобы он не только видел список предпочитаемых автомобилей, но и рядом с каждым автомобилем была информация о ремонтных компаниях.

Вот тут и возникает проблема - как передать такой сложный тип в шаблон django, так как я не могу делать там сложные операции, такие как индексирование или тому подобное. Я могу представить себе создание чего-то вроде словарей, содержащих эту информацию в сгруппированном виде (так, чтобы каждый словарь содержал все об автомобиле, а также список строк названий всех ремонтных компаний, которые к нему относятся). Но как получить доступ к такому словарю и его значениям из шаблона? Есть ли какой-нибудь лучший способ сделать это?

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

{{data.0}} // same as 'data[0]'
{{data.user_info}} // same as 'data["user_info"]'

// And you can chain these like this
{{data.0.user_info.id}}

Это не так сложно, как вы думаете, нет достаточной информации о ваших моделях, однако вы можете выполнить это требование путем:

В модели интересов вам нужно изменить "car_id" на внешний ключ от модели автомобиля, таким образом модель интересов будет выглядеть следующим образом:

class Interest(models.Model):
    repair_company_name = models.CharField(max_length=200)
    car_id = models.ForeignKey(Car, on_delete=models.CASCADE, related_name="interest")

Таким образом, вы можете получить список заинтересованных ремонтных мастерских следующим образом:

from django.shortcuts import get_list_or_404    
cars = get_list_or_404(Car, brand=request.user.preferred_brand)  # assume that user can have many preferred brands
for each car in cars:
    car.inetrest.all()
  

Что касается отображения их на html странице, вы можете использовать класс Listviews или делать вложенные списки, использование Listviewes не сложно, все что вам нужно это установить queryset таким образом:

qs = inetrest.objects.filter(car_id=request.user.preferred_brand) 

Конечно, это объяснение на высоком уровне и потребует некоторой доработки с вашей стороны

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