我正在使用Django的表单来验证API PATCH请求。在"视图" (我在引号中使用因为它不是直接视图,它是一个不安定的Resource
,但这应该是无关紧要的)处理这个补丁请求,self.data
包含一个字典更改License
对象的某些字段。我想用要更改的对象的实例来实例化ModelForm
。显然,我误解了这是如何工作的。见下文:
def handle_patch(self, pk):
license = License.objects.get(id=pk)
form = LicenseResourceForm(self.data, instance=license)
if not form.is_valid():
print(form.errors)
如果我将一些字段作为数据传递给上述函数,form.errors
会抱怨License
模型的所有其他必填字段,这意味着我显然不了解如何设置实例ModelForm
有效。
我在ModelForm
方法中为Django的clean()
代码本身添加了一些调试打印,当它开始执行清理过程时,我可以看到self.instance
填充了我期望的License
实例,这让我感到困惑 - ModelForm
对象知道实例,但是并没有使用它来填充空白"可以这么说。
那么我有什么误解呢?我一定是做错了。
编辑我意识到有些人可能希望看到LicenseResourceForm
本身,所以就是这样,包括我的调试打印:
class LicenseResourceForm(ModelForm):
"""Form for License Resource create and change endpoints."""
class Meta(object):
model = License
fields = ['customer', 'service', 'enabled', 'not_valid_before', 'not_valid_after']
def clean(self):
try:
print(self.instance)
super().clean()
except Exception as e:
print(e)
答案 0 :(得分:1)
Django表单不适合API使用,也不了解PATCH语义。它们用于用户在Web表单中输入或更改数据的工作流程,该表单始终将所有数据发布到后端。因此,将根据数据检查表单的fields
属性中列出的所有字段,并将任何缺少的字段验证为空白。
您可以通过巧妙地根据提供的数据动态设置字段列表来解决这个问题,但实际上您应该使用适当的工具来验证数据。我不知道不安,但是django-rest-framework有序列化器,可用于此。