Django - преобразование кортежей datetime.date - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь получить некоторые даты из моей модели.

В моем наборе запросов я получаю:

datetime.date(2019, 10, 15), datetime.date(2019, 10, 18), datetime.date(2019, 10, 2), datetime.date(2019, 9, 18), datetime.date(2019, 10, 28), datetime.date(2019, 10, 29)]

при запросе БД для моих "дат бронирования".

Мне нужно, чтобы они были преобразованы в обычные даты, и, если возможно, отформатируйте их следующим образом:

"19-10-2019"

Итак, формат дд-мм-гг.

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

вот, пожалуйста:

var unavailableDates = "{{ unavailable_dates }}"
        unavailableDates = unavailableDates.replace(/datetime.date/g, "").replace(/[{()}]/g, "").replace(/]/g, ' ').replace("[", ' ').split()
        var y = unavailableDates[0].match(/.{1,14}/g)
        var dates = []
        y.forEach((date, i) => {
            var now = moment(date).format('D-MM-YYYY')
            dates.push(now)
        })
        console.log(dates);
        function unavailable(date) {
            dmy = date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getFullYear();
            if ($.inArray(dmy, dates) == -1) {
                return [true, ""];
            } else {
                return [false, "", "Unavailable"];
            }
        }

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

Каков будет правильный путь достижениячто я хочу здесь сделать? Большое спасибо!

edit - мой взгляд:

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, }
    unavailable_dates = apartment.reservations.values_list('start_date', 'end_date')

    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
    args['unavailable_dates'] = list(itertools.chain(*unavailable_dates))
    print(unavailable_dates)
    return render(request, 'booking/apartment.html', args)

1 Ответ

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

Вы должны использовать соответствующий тип данных для передачи информации между Django и Javascript, который является JSON. По вашему мнению, вы должны преобразовать даты в строки в соответствующем формате, а затем преобразовать данные в JSON.

unavailable = [dt.strftime('%-d-%m-%Y') for dt in itertools.chain(*unavailable_dates)]
args['unavailable_dates'] = json.dumps(unavailable)

, тогда в вашем JS вы можете сделать:

var dates = JSON.parse("{{ unavailable_dates|safe }}")

и нет необходимости переформатировать их там.

Обратите внимание, однако, что ваш код Django не дает вам все недоступные даты;он просто дает вам начальную и конечную дату для каждого бронированияВозможно, вы захотите сделать что-то подобное, чтобы получить все недоступные даты:

unavailable = []
for start, end in apartment.reservations.values_list('start_date', 'end_date'):
    while start <= end:
        unavailable.append(start.strftime('%-d-%m-%Y'))
        start += datetime.timedelta(days=1)

args['unavailable_dates'] = json.dumps(unavailable)

Теперь у вас есть плоский список, состоящий из всех дат между началом и концом включительно для всех бронирований на квартиру,правильно отформатирован.

...