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)
Конечно, это объяснение на высоком уровне и потребует некоторой доработки с вашей стороны