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
Проблема заключается в следующем: все сидячие места генерируются как свободные, хотя список reserved_places состоит из некоторых элементов. Вот изображение карты с распечатанными reserved_places:
Я действительно спрашиваю себя, может ли это быть ошибкой фильтра или чем-то еще. Спасибо всем, кто это прочитал!
Ваш 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 для поиска зарезервированных мест.
