能否使用表单的is_valid()函数验证DRF提交的数据?
问题
我有一个非ModelForm的表单,带有自定义验证器,运行正常。现在需要添加一个API来提交相同的数据,是否可以使用该表单的is_valid()函数验证数据?
我尝试用initial参数实例化新表单,但表单始终验证不通过。在shell中用简单表单测试也出现同样问题:
# ./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
我肯定漏掉了某个步骤...
解答
完全可以用这个表单的is_valid()来验证API提交的数据,问题出在你实例化表单的方式上:
initial参数仅用于设置表单的初始展示值,不会把这些数据当作待验证的提交内容。Django表单只有在传入data参数(或直接将数据作为第一个位置参数)时,才会将其视为需要验证的提交数据。- 正确的实例化方式如下:
# 方式一:显式传入data参数 df = DogForm(data={'name':'Rex','age':3}) # 方式二:直接传位置参数(第一个参数默认就是data) df = DogForm({'name':'Rex','age':3})
此时调用df.is_valid()就会返回True。
- 针对API场景,你可以直接把请求携带的数据(比如DRF中的
request.data)传给表单的data参数,之后调用is_valid()就能完成验证,自定义验证器也会正常触发,和普通表单提交的验证逻辑完全一致。
内容的提问来源于stack exchange,提问作者jeffreyb
相关产品推荐
相关产品推荐

