我使用Django的表单来验证API补丁请求。在处理此修补程序请求的“视图”(我在引号中使用它,因为它实际上不是一个直接的视图,它是一个无休止的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
上设置实例是如何工作的。你知道吗
我在clean()
方法中为Django的ModelForm
代码本身添加了一些调试打印,当它开始执行清理过程时,我可以看到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)
Django表单不适合API使用,也不理解补丁语义。它们用于用户在web表单中输入或更改数据的工作流,该表单将始终将所有数据发布到后端。因此,表单的
fields
属性中列出的所有字段都将根据数据进行检查,任何缺少的字段都将验证为空。你知道吗您可以通过做一些聪明的事情来解决这个问题,根据提供的数据动态地设置字段列表,但实际上您应该使用适当的工具来验证您的数据。我不知道躁动,但DjangoREST框架有序列化程序,可以用于此。你知道吗
相关问题 更多 >
编程相关推荐