Django: почему мой пользовательский фильтр не находит существующий элемент в массиве?

Я новичок в Django. Сейчас я работаю над своим первым проектом: бронирование мест на мероприятие в кинотеатре. html карта мест основана на массиве столбцов и строк, предоставленных из модели зала.

Существует также модель Invoice, которая хранит информацию о зарезервированных местах, основанную на этом событии. На основании этого я пытаюсь отключить html-карту чекбоксов мест, которые уже зарезервированы.

Вот мой код:

views.py

def event_map(request, slug, event_id):
selected_event = Event.objects.get(pk=event_id)

movie = selected_event.film
hall = selected_event.hall
time = selected_event.get_time_slot_display()
date_event = selected_event.get_week_day_display()

sits = list(range(0, hall.hall_sits))
cols = list(range(0, hall.hall_cols))

hall_information = generate_hall_information(hall.hall_name)

reserved_places = list()
invoices = Invoice.objects.all().filter(event=selected_event)
for invoice in invoices:
    reserved_places += invoice.invoice_details.split(',')

reservation_form = Reservation()

if request.method == 'POST':
    print(request.POST)
    form = Reservation(request.POST)
    if form.is_valid():
        post = form.save(commit=False)
        post.invoice = request.user
        post.event = selected_event
        post.save()

return render(request, 'pages/event_map.html', {
    'movie_name': movie.name,
    'hall': hall,
    'time': time,
    'date': date_event,
    'sits': sits,
    'cols': cols,
    'hall_information': hall_information,
    'reservation_form': reservation_form,
    'reserved_places': reserved_places,
    'test': reserved_places
})

event-map.html

            <div class="theatre-map event-map-grid hall-{{ hall }}" id="theatre-map-target">
                {% for sit in sits %}
                    {% if sit|if_in_list:reserved_places %}
                         <label class="res" id="{{ sit }}" disabled=""></label>
                    {% else %}
                        <label class="emp box-label" id="{{ sit }}"></label>
                    {% endif %}

                {% endfor %}
        </div>

templatetags/cinema_extras.py

enter image description here

Проблема заключается в следующем: все сидячие места генерируются как свободные, хотя список reserved_places состоит из некоторых элементов. Вот изображение карты с распечатанными reserved_places:enter image description here

Я действительно спрашиваю себя, может ли это быть ошибкой фильтра или чем-то еще. Спасибо всем, кто это прочитал!

Ваш reserved_places является списком строк, а не списком целых чисел, и 0 не равен '0'.

Вы должны преобразовать их в инты, так:

reserved_places = []
invoices = Invoice.objects.filter(event=selected_event)
for invoice in invoices:
    reserved_places += map(int, invoice.invoice_details.split(','))

Но использование строки со списком целых чисел (разделенных запятыми) может быть не лучшим способом хранения зарезервированных мест (без каламбура): это затрудняет запрос к базе данных для поиска, например, invoice, где определенный элемент выбран, а также делает немного "неудобным" запрос с Invoice для поиска зарезервированных мест.

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