Можно ли использовать функцию 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
, если хотите.