Джанго - Получение конкретных данных из модели - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь сделать систему бронирования (для квартир). Идея состоит в том, что пользователи могут выбрать дату начала и дату окончания и забронировать квартиру, если она не забронирована.

У меня есть модель резервирования с датой начала и конца, которую я использую для определениядаты бронирования квартиры.

Пользователи JQuery Ui Date Picker (небольшой календарь), чтобы выбрать даты. «Недоступные» даты отображаются серым цветом. Вот как я это сделал:

<script type="text/javascript">
        var unavailableDates = ['{{ reservation.all.0.start_date|date:"d-m-Y" }}', '{{ reservation.all.0.end_date|date:"d-m-Y" }}'];
        console.log(unavailableDates);
        function unavailable(date) {
            dmy = date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getFullYear();
            if ($.inArray(dmy, unavailableDates) == -1) {
                return [true, ""];
            } else {
                return [false, "", "Unavailable"];
            }
        }

        $(function () {
            $("#datepicker").datepicker({
                dateFormat: 'MM-dd-yy',
                beforeShowDay: unavailable
            });

        });
    </script>


Я использую ...

{{ reservation.all.0.start_date|date:"d-m-Y" }}

..., чтобы выделить дату в календаре серым цветом.

MyМодель бронирования выглядит следующим образом:

class Reservation(models.Model):
    apartment = models.ForeignKey(Apartment, related_name='reservations',
                                  on_delete=models.CASCADE, blank=True, null=True)
    start_date = models.DateField(blank=True, null=True, unique=True)
    end_date = models.DateField(blank=True, null=True, unique=True)
    name = models.CharField(default="", max_length=200, unique=True)

    def __str__(self):
        return self.name

И, на мой взгляд, у меня есть:

def apartment_view(request, apartment_id):

    reservation = Reservation.objects.filter(apartment__pk=apartment_id)
    apartment = get_object_or_404(Apartment, pk=apartment_id)
    context = {'apartment': apartment, }

    form = ReservationForm()
    if request.method == 'GET':
        form = ReservationForm()

    elif request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid():
            reservation = form.save(commit=False)
            reservation.apartment = apartment
            reservation.save()
            form.save()
            return HttpResponseRedirect('/booking/')
    args = {}
    args['form'] = form
    args['apartment'] = context
    args['reservation'] = reservation
    return render(request, 'booking/apartment.html', args)

Так как мне нужно, чтобы мои бронирования были отфильтрованы до нужной квартиры.

У меня вопрос: как я могу запросить ВСЕ даты, связанные с квартирой, даты начала и окончания?

Поэтому мне нужны все даты для квартиры 1, затем все даты для квартиры2 ... и т. Д.

Я не уверен, что делать по этому поводу, я прошу прощения, если сообщение сбивает с толку.

Спасибо !!!

1 Ответ

1 голос
/ 11 октября 2019

Позднее редактирование: просмотрев свой код JS, вы можете захотеть сделать что-то вроде этого:

import itertools
unavailable_dates = apartment.reservations.values_list('start_date', 'end_date')
context['unavailable_dates'] = list(itertools.chain(*unavailable_dates)) # to convert _list_ of tuples to simple list

Вы можете получить даты начала / окончания бронирования, связанные с квартирой, подобной этой:

apartment = get_object_or_404(Apartment, pk=apartment_id)
context['appartment_reservations_dates'] = apartment.reservations.values_list('start_date', 'end_date')

Если вы хотите работать со всем объектом Reservation непосредственно в шаблоне HTML, вы можете сделать это следующим образом:

{% for reservation in apartment.reservation.all %}
    {{ reservation.start_date }} - {{ reservation.end_date }}
{% endfor %}

Ваше представление может выглядеть следующим образом:

def apartment_view(request, apartment_id):
    context = dict()

    context['apartment'] = get_object_or_404(Apartment, pk=apartment_id)
    context['reservations'] = apartment.reservations.all() # if you want all existing reservations for this specific appartment

    form = ReservationForm()
    if request.method == 'GET':
        form = ReservationForm()

    elif request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid(): # you can add extra validation here making sure whoever tries to book is booking for an available time interval
            reservation = form.save(commit=False)
            reservation.apartment = apartment
            reservation.save()
            form.save()
            return HttpResponseRedirect('/booking/')

    context['form'] = form
    return render(request, 'booking/apartment.html', args)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...