Django ModelForm'instance'参数未按预期工作

2024-04-25 21:37:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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)

Tags: 对象django实例instanceselfformclean视图
1条回答
网友
1楼 · 发布于 2024-04-25 21:37:59

Django表单不适合API使用,也不理解补丁语义。它们用于用户在web表单中输入或更改数据的工作流,该表单将始终将所有数据发布到后端。因此,表单的fields属性中列出的所有字段都将根据数据进行检查,任何缺少的字段都将验证为空。你知道吗

您可以通过做一些聪明的事情来解决这个问题,根据提供的数据动态地设置字段列表,但实际上您应该使用适当的工具来验证您的数据。我不知道躁动,但DjangoREST框架有序列化程序,可以用于此。你知道吗

相关问题 更多 >