Как правильно вывести данные из бд в шаблон? Django
Такая проблема: есть раздел с жилыми комлексами, у каждого жк есть отдельная страничка, на которой находятся карточки с домами. Хочу, чтобы при нажатии на карточку дома, выводилась информация этого дома из бд. (При нажатии на кнопку "Подробнее", с помощиью js у блока карточки изменяется свойство с display: none; на display: block;)

views.py
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.views.generic import DetailView
from .models import *
def service(request):
active = ['service']
return render(request, 'service/service.html', locals())
def catalog_nb(request):
active = ['service']
complex_list = Complex.objects.all()
paginator = Paginator(complex_list, 3)
page = request.GET.get('page')
try:
complexes = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
complexes = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
complexes = paginator.page(paginator.num_pages)
page_range = paginator.page_range
return render(request, 'service/catalog-nb.html', {"complexes": complexes,
"page_range": page_range,
"active": active})
class ComplexDetailView(DetailView):
active = ['service']
model = Complex
template_name = 'service/complex.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['gallery'] = ComplexGallery.objects.filter(complex=context['complex'])
context['houses'] = House.objects.filter(complex=context['complex'])
context['apartments'] = {h.pk: Apartment.objects.filter(house=h) for h in context['houses']}
print(context['apartments'])
return context
Шаблон
{% extends 'base.html' %}
{% block content %}
{% load static %}
<div class="continer block">
<div class="row " id="all">
<div class="col-lg-10 offset-1">
<h1>{{ complex.name }}</h1>
<hr width="271px" >
<div class="descr-section">
<h2 class="complex-section">Описание жилого комлекса</h2>
<p class="complex-descr">{{ complex.description }}</p>
</div>
<div class="descr-section">
<h2>Расположение</h2>
<div class="map"></div>
</div>
<div class="gallery-section">
<h2 class="text-left">Фотографии</h2>
<div class="gallery-i">
{% if gallery %}
{% for img in gallery %}
<div class="col-lg-3 col-sm-5 thumb">
<a data-fancybox="gallery" href="{{ img.gal_img.url }}">
<img class="img-fluid" src="{{ img.gal_img.url }}" alt="...">
</a>
</div>
{% endfor %}
{% endif %}
</div>
</div>
<div class="house-section">
<h2 class="text-left">Дома</h2>
<div class="h-cards-wrapper">
{% for house in houses %}
<div class="h-card">
<div class="h-card-info">
<p class="house-title">Дом {{ house.house_number }}</p>
<button class="btn btn-primary read-more h-btn" id="showCard" onClick="viewHouseCard()" >
Подробнее
</button>
</div>
</div>
<div class="house-card" id="house-card">
<button class="closeCard" onClick="closeHouseCard()">
<i class="fa fa-times" aria-hidden="true"></i>
</button>
<div class="card-content">
<h1 class="white h-card-title">Дом {{ house.house_number }}</h1>
<table class="table-container">
<tr>
<th>Номер <br> квартиры</th>
<th>Этаж</th>
<th>Кол-во <br> комнат</th>
<th>Площадь</th>
<th>Отделка</th>
<th>Цена <br> за м2</th>
<th>Цена за <br> объект</th>
<th>Планировка</th>
</tr>
<tr>
<!--Тут надо что-то делать с циклом for, но не понимаю что именно(-->
<tr>
<td>{{ap.apartment_number}}</td>
<td>{{ap.level}}</td>
<td>{{ap.room}}</td>
<td>{{ap.square}}</td>
<td>{{ap.finishing}}</td>
<td>{{ap.price_m}}</td>
<td>{{ap.price_total}}</td>
<td><button class="view-plan" onClick="viewHousePlan()"><i class="fa fa-eye" aria-hidden="true"></i></button></td>
</tr>
<!-- {% endfor %}-->
</tr>
</table>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}
models.py
from django.db import models
from .utils import *
class Complex(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(blank=True)
description = models.TextField()
img = models.ImageField(upload_to='complex/', blank=True)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = from_cyrillic_to_eng(str(self.name))
super().save(*args, **kwargs)
def __str__(self):
return '%s' % self.name
class ComplexGallery(models.Model):
complex = models.ForeignKey(Complex, on_delete=models.CASCADE, blank=True)
gal_img = models.ImageField(upload_to='complex/gallery/', blank=True)
def __str__(self):
return '%s' % self.complex.name
class House(models.Model):
complex = models.ForeignKey(Complex, on_delete=models.CASCADE, blank=True)
house_number = models.IntegerField()
def __str__(self):
return '%s' % self.house_number
class Apartment(models.Model):
house = models.ForeignKey(House, on_delete=models.CASCADE, blank=True)
apartment_number = models.IntegerField()
level = models.IntegerField()
room = models.IntegerField()
square = models.FloatField()
finishing = models.BooleanField(default=False)
price_m = models.DecimalField(max_digits=7, decimal_places=1)
price_total = models.DecimalField(max_digits=10, decimal_places=1)
plan_img = models.ImageField(upload_to='complex/apartment/', blank=True)
def __str__(self):
return '%s' % self.apartment_number
Ответы (1 шт):
Автор решения: Vadim.Sharoikin
→ Ссылка
К связанным моделям обращаются через ключевое слово _set, если не указанно related_name. Если я вас правильно понял.
{% for ap in house.apartment_set.all %}
<tr>
<td>{{ap.apartment_number}}</td>
<td>{{ap.level}}</td>
<td>{{ap.room}}</td>
<td>{{ap.square}}</td>
<td>{{ap.finishing}}</td>
<td>{{ap.price_m}}</td>
<td>{{ap.price_total}}</td>
<td><button class="view-plan" onClick="viewHousePlan()"><i class="fa fa-eye" aria-hidden="true"></i></button></td>
</tr>
{% endfor %}