Даты проверки из DateTimeField совпадают - PullRequest
1 голос
/ 11 марта 2019

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

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])
    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])
    lesson_weekly = forms.BooleanField(required=False)

    class Meta:
        model = Lesson
        fields = ('lesson_instrument', 'lesson_datetime_start', 'lesson_datetime_end', 'lesson_weekly')

    def clean(self):
        cleaned_data = super().clean()
        lesson_datetime_start = self.cleaned_data.get("lesson_datetime_start")
        lesson_datetime_end = self.cleaned_data.get("lesson_datetime_end")
        if lesson_datetime_start.date() != lesson_datetime_end.date() and lesson_datetime_start >= lesson_datetime_end:
            raise ValidationError('Dates have to be the same and end time must be later than start time')
        return cleaned_data

Ответы [ 3 ]

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

Я не уверен, почему вы определили метод clean2().Джанго не ожидает этот метод и никогда не вызовет его.

Вы должны поместить всю эту логику в один и тот же метод, а именно clean().

0 голосов
/ 12 марта 2019

Глядя на ваш обновленный .clean() метод:

def clean(self):
    cleaned_data = super().clean()
    lesson_datetime_start = self.cleaned_data.get("lesson_datetime_start")
    lesson_datetime_end = self.cleaned_data.get("lesson_datetime_end")
    if lesson_datetime_start.date() != lesson_datetime_end.date() and lesson_datetime_start >= lesson_datetime_end:
        raise ValidationError('Dates have to be the same and end time must be later than start time')
    return cleaned_data

Ошибка произойдет, только если даны оба условия, что не похоже на то, что вы ищете.

Я предлагаю вам разделить логику в вашем if утверждении на 2 отдельных if s:

def clean(self):
    cleaned_data = super().clean()
    lesson_datetime_start = cleaned_data.get("lesson_datetime_start")
    lesson_datetime_end = cleaned_data.get("lesson_datetime_end")
    print('lesson_datetime_start', lesson_datetime_start)
    print('lesson_datetime_end', lesson_datetime_end)

    if lesson_datetime_start.date() != lesson_datetime_end.date():
        raise ValidationError('Dates have to be the same.')

    if lesson_datetime_start >= lesson_datetime_end:
        raise ValidationError('End time must be later than start time.')

    return cleaned_data

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

0 голосов
/ 11 марта 2019

В вашем методе clean() попробуйте использовать переменную cleaned_data (которую вы подготовили, но фактически никогда не используете) вместо self.cleaned_data.

Это решает вашу проблему?

...