Можно ли использовать функцию is_valid формы для данных, переданных DRF?

У меня есть форма (не ModelForm) с пользовательскими валидаторами, которая работает нормально. Теперь нужно добавить API для отправки тех же данных. Можно ли использовать функцию is_valid() формы для проверки данных?

Я пытался заполнить новый экземпляр формы, используя initial, но форма никогда не является действительной. Попробовал в оболочке с простой формой и увидел то же самое.

# ./manage.py shell
Python 3.6.10 (default, Jan 17 2021, 19:51:05) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django import forms
>>> class DogForm(forms.Form):
...   name = forms.CharField(max_length=6)
...   age = forms.IntegerField()
... 
>>> df = DogForm(initial={'name':'Rex','age':3})
>>> df.is_valid()
False

Я где-то пропустил шаг...

Да, вы можете использовать вашу форму для проверки пост-данных сериализатора, все, что вам нужно сделать, это предоставить пользовательский validate метод сериализатора.

Вот пример кода, как это реализовать (я не знаю, хорошо ли он работает с forms.Form, так что вам придется попробовать):

class SomeModelSerializer(serializers.ModelSerializer):
    ...

    form_class = FormExample # some dummy form

    def validate(self, attrs):
        # Check if we have a form_class defined
        if hasattr(self, "form_class") and self.form_class != None:
            self.form: forms.ModelForm = self.form_class(
                instance=self.instance,
                data=attrs
            )
            # Check if data is clean
            if not self.form.is_valid():
                raise serializers.ValidationError(self.form.errors)

            return attrs

        # If you don't provide a form class, the default validate will run
        return super().validate(attrs=attrs)

Вы можете использовать этот класс в качестве базового ModelSerializer, если хотите.

Вернуться на верх