Время не экономит в UTC - PullRequest
0 голосов
/ 12 марта 2019

У меня есть форма с TimeField, которая принимает данные из динамически созданного выпадающего списка.Все остальные мои формы успешно конвертируют даты и время в зависимости от часового пояса пользователя и сохраняют их в базе данных как UTC.Это, кажется, не происходит с моим вводом времени в этой конкретной форме.Я полагаю, что это потому, что он берет строковое значение из списка, который у меня есть, но я не уверен, как это изменить, поскольку список необходим для способа записи моего динамически генерируемого списка ввода.Буду признателен за помощь в поиске способа динамически генерировать выпадающий список времени и сохранять его в формате UTC.

HTML

<div class="form-group">
    <label>Time</label>
    {{ form.booked_time }}
</div>

models.py

class Booked(models.Model):
    booked_time = models.TimeField(null=True, blank=True)

forms.py

class BookedForm(forms.ModelForm):
    booked_time = forms.ChoiceField(choices=time_list, widget=forms.Select(attrs={'class' : 'form-control', 'id' : 'time', 'required' : 'True'}))
 'booked_time')

со списком времени, который выглядит примерно так

('', 'Time'),
('8:00 am', '8:00 am'),
('8:15 am', '8:15 am'),
('8:30 am', '8:30 am'),

views.py

def book_lesson(request, lesson_id):
    if request.user.is_authenticated and request.user.time_zone:
        activate(request.user.time_zone)
    else:
        deactivate()

    lesson = Lesson.objects.get(id=lesson_id)

    if request.method == 'POST':
        form = BookedForm(request.POST)

        if form.is_valid():
            book = form.save(commit=False)
            book.student_user = request.user
            book.teacher_user = lesson.user
            book.save()
            messages.success(request,'Lesson was successfully booked!')
            return redirect('/teacher/dashboard')

        else:
            form = BookedForm()

    form = BookedForm()
    context = {'form' : form, 'lesson' : lesson}
    return render(request, 'view/book_lesson.html', context)

JavaScript

var start = document.getElementById('start').innerHTML.split('.').join('').toLocaleLowerCase();
var end = document.getElementById('end').innerHTML.split('.').join('').toLocaleLowerCase();
var time = document.getElementById('time');

time.disabled = true;

var slotTimes = [];
document.getElementById("length").onchange = function (evt) {
    var timeDistance = evt.target.value;
    var startMoment = moment(start, "h:mm a");
    var endMoment = moment(end, "h:mm a");
    slotTimes = [];

    while (startMoment.isSameOrBefore(endMoment)) {
        slotTimes.push(startMoment.format("h:mm a"));
        startMoment = startMoment.add(timeDistance, 'minutes');
    }

    addDropdown();
    disabled();
};
function addDropdown() {
    var doc = '',
        times = slotTimes,
        i;
    for (i = 0; i < times.length; i++) {
        doc += "<option value='" + times[i] + "'>" + times[i] + "</option>";
    }

    document.getElementById('time').innerHTML = doc;
    disabled();
}

1 Ответ

1 голос
/ 12 марта 2019

TimeFields нет часовых поясов. Из документации :

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

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

На практике вы не можете преобразовать время в UTC, не зная даты. Это потому, что конверсия зависит от даты (подумайте о летнем времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...