Не отправляйте время после 23:59 - PullRequest
0 голосов
/ 11 марта 2019

У меня есть форма, которая создает урок с датой и временем.В настоящее время у меня есть валидаторы, чтобы гарантировать, что прошлые даты не могут быть использованы, которые работают отлично.Однако у меня возникают проблемы с визуализацией того, как будет работать валидатор, который проверяет, что введенное время не прошло в 23:59.Я включил фрагмент того, чего я пытаюсь достичь (я знаю, что это не работает так, как он выложен, он просто обеспечивает контекст).Я бы оценил любую помощь с этим.

forms.py

def validate_date1(value):
    if value < timezone.now():
        raise ValidationError('Date cannot be in the past')

def validate_date2(value):
    if value < timezone.now():
        raise ValidationError('Date cannot be in the past')

def present_date1(value):
    if value > '11:59 pm':
        raise ValidationError('Time cannot be past 11:59 pm')

def present_date2(value):
    if value > '11:59 pm':
        raise ValidationError('Time cannot be past 11:59 pm')

class LessonForm(forms.ModelForm):
    lesson_instrument = forms.ChoiceField(choices=instrument_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
    lesson_datetime_start = forms.DateTimeField(input_formats=['%Y-%m-%d %I:%M %p'], widget=forms.DateTimeInput(attrs={'class': 'form-control', 'placeholder':'YYYY-MM-DD Hour:Minute am/pm'}), validators=[validate_date1, present_date1])
    lesson_datetime_end = forms.DateTimeField(input_formats=['%Y-%m-%d %I:%M %p'], required=False, widget=forms.DateTimeInput(attrs={'class': 'form-control', 'placeholder':'YYYY-MM-DD Hour:Minute am/pm'}), validators=[validate_date2, present_date2])
    lesson_weekly = forms.BooleanField(required=False)

Ответы [ 3 ]

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

Валидаторы для DateTimeField получат объект datetime.datetime, а не строку.

Здесь мы извлекаем компонент времени из даты и времени и сравниваем его с нашим постоянным последним возможным временем.

import datetime

LAST_POSSIBLE_TIME = datetime.time(23, 59)

def validate_time(value):
    if value.time() > LAST_POSSIBLE_TIME:
        raise ValidationError('Time cannot be past 11:59 pm')
0 голосов
/ 11 марта 2019

Вы хотите проверить lesson_datetime_start и lesson_datetime_end вместе, а не отдельно. Только проверка того, что время не превышает 23:59, не сокращает его, поскольку это может привести к недействительности 2019-05-04 23:00 - 2019-05-05 12:00, даже если это правильный начальный интервал в один час в 11 часов вечера

Для этого добавьте метод clean() в форму:

def clean(self):
    cleaned_data = super().clean()
    if self.cleaned_data.get('lesson_datetime_start') \
            and self.cleaned_data.get('lesson_datetime_end') \
            and self.cleaned_data['lesson_datetime_start'] >= self.cleaned_data['lesson_datetime_end']:
        raise ValidationError({'lesson_datetime_end': "End time must be later than start time."})
    return cleaned_data

Таким же образом, вы можете добавить валидатор, что продолжительность урока не превышает определенный ожидаемый интервал времени (например, не может быть больше 4 часов), вычитая два поля datetime и сравнивая их до datetime.timedelta(hours=x).

Вы также можете сделать это в своей модели, при условии, что у вас есть модель Lesson с полями lesson_start и lesson_end:

def clean(self):
    if self.lesson_start and self.lesson_end and self.lesson_start >= self.lesson_end:
        raise ValidationError({'lesson_end': "End time must be later than start time."})
0 голосов
/ 11 марта 2019

Таким образом, дата ввода не может быть в прошлом и не может быть после 23:59, поэтому в основном она должна быть в остальной части текущего дня.

Как насчет:

import pytz

def date_is_not_past(dt):
    if dt < datetime.now(pytz.UTC):
        raise ValidationError('Date cannot be in the past')

def date_is_today(dt):
    if dt.date() != datetime.now(pytz.UTC).date():
        raise ValidationError('Date needs to be today')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...