You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用表单的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:55:17