使用有效实例设置后 django 表单无效

Posted

技术标签:

【中文标题】使用有效实例设置后 django 表单无效【英文标题】:django form invalid after setting it up with a valid instance 【发布时间】:2012-12-13 06:53:33 【问题描述】:

我真的很困惑为什么这个 form.is_valid() 返回 False:

这是我创建的 django 模型:

class aModel(models.Model):
    some_id = models.IntegerField()

我将Model 转换为ModelForm,并使用Model 的实例创建一个ModelForm 实例。这个ModelForm 实例不应该是有效的吗?

>>> class aModelForm(forms.ModelForm):
...     class Meta:
...             model = aModel
... 
>>> am = aModel.objects.get(id=1)
>>> for k,v in am.__dict__.items(): print k,v
... 
_state <django.db.models.base.ModelState object at 0x1020c8a50>
id 1
some_id 5
>>> form = aModelForm(instance=am)
>>> form.is_valid()
False
>>> am.save()
>>> am.some_id = 6
>>> am.save()
>>> 

为什么表单无效?我需要做什么才能使表单有效?

【问题讨论】:

form.errors 返回 【参考方案1】:

这个表单好像没有绑定数据,所以无法验证。您可以通过在form.is_valid() 之前打印form.is_bound() 来验证。

如果没有绑定,我认为你无法验证。要绑定数据,您需要将数据作为字典添加到表单的第一个参数中。

form = aModelForm('some_id': am.some_id, instance=am)
form.is_valid()

更多详情请见Django - Forms API。

【讨论】:

我已经阅读了 Forms API 足够多的内容,但您的简单回答有助于增加洞察力,让一切变得更加清晰。谢谢! 你能详细说明数据应该是什么吗?我不明白为什么它需要我的实例以外的任何东西。 好吧,我假设您正在更新实例的数据。只是简单地获取实例只会将实例分配给 ModelForm,但不会绑定您从请求 POST 更新/验证的数据。当实例没有以任何方式更改时,您不会验证该实例是否符合 ModelForm。它在上次保存时已经过验证。

以上是关于使用有效实例设置后 django 表单无效的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django-storages 将图像上传到亚马逊 S3?在管理员中上传有效,但在网站表单中无效

如何设置模型实例以在Django中生成确认表单

表单初始化后Django设置字段值

为啥如果有一个无效的字段,需要有效的表单 2 次才能获得有效的下一个字段?

如何在 Django REST Framework HTML 表单中自动设置 DateTime 字段的值?

Django:使用 Jquery 的动态表单集仅保存第一个表单集实例