Итерация данных в таблице в Django
У меня возникают проблемы при итерации данных в таблице. Мне нужно добиться того, чтобы в таблице отображались данные о бронировании в разрабатываемой мной системе бронирования.
Объясню, чего я пытаюсь достичь:
Как показано на изображении ниже, я хочу отобразить бронирования на основе времени их бронирования.
По сути, я хочу назначить colspan каждому td на основе значения времени бронирования.

Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь перебрать логику для воссоздания этой таблицы, у меня возникает проблема, что отображаются только некоторые ячейки. Я размещаю изображение моих результатов:
Теперь я размещаю некоторый код, чтобы, возможно, кто-то мог понять, что я делаю неправильно, потому что я не смог найти правильный способ исправить это.
models.py
class AirportTime(models.Model):
aerodrome = models.ForeignKey(Aerodrome, on_delete=models.CASCADE, blank=True, null=True)
opening_time = models.TimeField()
closing_time = models.TimeField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.opening_time) + ' ' + str(self.closing_time)
class Booking(models.Model):
aircraft = models.ForeignKey(Aircraft, on_delete=models.CASCADE)
student = models.ForeignKey(
Student, on_delete=models.CASCADE, blank=True, null=True)
instructor = models.ForeignKey(
Instructor, on_delete=models.CASCADE, blank=True, null=True)
date = models.DateField()
start_time = models.TimeField()
end_time = models.TimeField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
views.py
def index(request, data):
if data is None:
date_obj = datetime.now().date()
else:
date_obj = datetime.strptime(data, '%Y-%m-%d')
next_day_obj = date_obj + timedelta(days=1)
next_day_link = next_day_obj.strftime('%Y-%m-%d')
prev_day_obj = date_obj - timedelta(days=1)
prev_day_link = prev_day_obj.strftime('%Y-%m-%d')
#Table times between 8 and 19
airport_openings = AirportTime.objects.get(aerodrome=1)
opening_time = str(airport_openings.opening_time)
closing_time = str(airport_openings.closing_time)
date_render = date_obj.strftime('%d-%m-%Y')
date_reset = datetime.now().date().strftime('%Y-%m-%d')
start = datetime.strptime(opening_time, "%H:%M:%S")
end = datetime.strptime(closing_time, "%H:%M:%S")
min_gap = 30
arr = [(start + timedelta(hours=min_gap*i/60)).strftime("%H:%M")
for i in range(int((end-start).total_seconds() / 60.0 / min_gap))]
aircrafts = Aircraft.objects.filter(is_active=True)
bookings = Booking.objects.filter(date=data)
table_data = []
for aircraft in aircrafts:
aircraft_bookings = bookings.filter(aircraft=aircraft)
row_data = []
for a in arr:
# time_a = datetime.strptime(a, "%H:%M")
for booking in aircraft_bookings:
if booking.start_time.strftime('%H:%M') == a:
row_data.append({
'colspan': int((datetime.combine(date.min, booking.end_time) - datetime.combine(date.min, booking.start_time)).total_seconds()/60.0/min_gap),
'booking': booking
})
else:
row_data.append({
'colspan': 1,
'booking': False,
})
table_data.append({
'aircraft': aircraft,
'row_data': row_data,
})
context = {
'date_render': date_render,
'next_day_obj': next_day_obj,
'next_day_link': next_day_link,
'prev_day_link': prev_day_link,
'prev_day_obj': prev_day_obj,
'date_reset': date_reset,
'arr': arr,
'aircrafts': aircrafts,
'bookings': bookings,
'table_data': table_data,
}
return render(request, 'booking/index.html', context)
html:
{% block content %}
<a href="{% url 'booking:index' data=prev_day_link %}">Prev Day</a>
<a href="{% url 'booking:index' data=date_reset %}">Today</a>
<a href="{% url 'booking:index' data=next_day_link %}">Next Day</a>
<table class="table-bordered table-striped table table-sm">
<thead>
<tr>
<th class="text-center border border-info bg-primary" colspan="24">{{date_render}}</th>
</tr>
<tr>
<th class="text-center border border-info bg-primary"></th>
{% for a in arr %}
<th class="border border-info">{{a}}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in table_data %}
<tr>
<th class="bg-primary border border-info">{{row.aircraft.registration}}</th>
{% for row_item in row %}
{% if row_item.booking %}
<td colspan="{{row_item.colspan}}" class="table-hover border border-info">
</td>
{% else %}
<td colspan="{{row_item.colspan}}" class="table-hover border border-info">
<a href="{% url 'booking:new_booking' %}"> </a>
</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock content %}
Я пытался сделать так: сначала в цикле перебрать массив times, чтобы отображались времена, а после этого, чтобы данные были представлены непосредственно в списке table_data. Но либо что-то не так в моей логике, либо я что-то упускаю.
