Как обеспечить валидацию в формах django

У меня есть форма, которая принимает значения start_time и end_time, оба из которых являются полями DateTimeFields в моем model.py. Однако я хочу убедиться, что время начала_времени меньше времени окончания_времени. Я создал функцию в моем forms.py, но, похоже, она не дает никакого эффекта. Как я могу обеспечить эту проверку?

my forms.py

class EventForm(ModelForm):
    class Meta:
        model = Event
        # datetime-local is a HTML5 input type, format to make date time show on fields
        widgets = {
            "start_time": DateInput(
                attrs={"type": "datetime-local"}, format="%Y-%m-%dT%H:%M"
            ),
            "end_time": DateInput(
                attrs={"type": "datetime-local"}, format="%Y-%m-%dT%H:%M"
            ),
            "title": TextInput(attrs={"placeholder": "Title"}),
            "description": TextInput(attrs={"placeholder": "Description"}),
            "author": forms.HiddenInput(),
        }
        fields = ["title", "description", "start_time", "end_time", "author"]

    def clean_time(self):
        start_time = self.cleaned_data.get('start_time')
        end_time = self.cleaned_data.get('end_time')
        if start_time > end_time:
                raise forms.ValidationError("Start time cannot be greater than end time")
        return self.cleaned_data

        def __init__(self, *args, **kwargs):
            super(EventForm, self).__init__(*args, **kwargs)
            # input_formats parses HTML5 datetime-local input to datetime field
            self.fields["start_time"].input_formats = ("%Y-%m-%dT%H:%M",)
            self.fields["end_time"].input_formats = ("%Y-%m-%dT%H:%M",)

мой views.py для создания события:

def event_create(request):
    instance = Event()
    data = request.POST.copy()
    data["author"] = request.user
    form = EventForm(data or None, instance=instance)
    if request.POST and form.is_valid():
        form.save()
        return HttpResponseRedirect(reverse("cal:calendar"))
    return render(request, "cal/create_event.html", {"event": form})

Используйте метод очистки формы Django

Для получения более подробной информации обратитесь сюда https://docs.djangoproject.com/en/3.2/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

Попробуйте это

class EventForm(ModelForm):
    class Meta:
        model = Event
        # datetime-local is a HTML5 input type, format to make date time show on fields
        widgets = {
            "start_time": DateInput(
                attrs={"type": "datetime-local"}, format="%Y-%m-%dT%H:%M"
            ),
            "end_time": DateInput(
                attrs={"type": "datetime-local"}, format="%Y-%m-%dT%H:%M"
            ),
            "title": TextInput(attrs={"placeholder": "Title"}),
            "description": TextInput(attrs={"placeholder": "Description"}),
            "author": forms.HiddenInput(),
        }
        fields = ["title", "description", "start_time", "end_time", "author"]

    def clean(self): # use this updated
        start_time = self.cleaned_data.get('start_time')
        end_time = self.cleaned_data.get('end_time')
        if start_time > end_time:
                raise forms.ValidationError("Start time cannot be greater than end time")
        return self.cleaned_data

        def __init__(self, *args, **kwargs):
            super(EventForm, self).__init__(*args, **kwargs)
            # input_formats parses HTML5 datetime-local input to datetime field
            self.fields["start_time"].input_formats = ("%Y-%m-%dT%H:%M",)
            self.fields["end_time"].input_formats = ("%Y-%m-%dT%H:%M",)
Вернуться на верх