Итерация данных в таблице в Django

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

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

enter image description here

Теперь я размещаю некоторый код, чтобы, возможно, кто-то мог понять, что я делаю неправильно, потому что я не смог найти правильный способ исправить это.

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' %}">&nbsp;</a>
          </td>
          {% endif %}
          {% endfor %}
          
        </tr>
        {% endfor %}
    </tbody>
  </table>
{% endblock content %}

Я пытался сделать так: сначала в цикле перебрать массив times, чтобы отображались времена, а после этого, чтобы данные были представлены непосредственно в списке table_data. Но либо что-то не так в моей логике, либо я что-то упускаю.

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