django 中的 ModelForms 是不是仅用于发布?
Posted
技术标签:
【中文标题】django 中的 ModelForms 是不是仅用于发布?【英文标题】:Are ModelForms in django used only for POSTing?django 中的 ModelForms 是否仅用于发布? 【发布时间】:2013-05-10 04:25:38 【问题描述】:ModelForms 是一种防止重复创建模型定义的好方法。我想做的是利用该功能并将其用于处理 POST 请求之外的其他用途。我经常使用表单进行验证。
例子:
假设您有一个包含字段(电子邮件、密码、名字、姓氏)的用户模型。 email 字段是唯一的并且是一个索引。
UserCreationForm:使用所有字段,如果电子邮件已存在则验证失败。处理 POST 请求 UserUpdateForm:相同的模型,但不允许更改电子邮件。因为这个字段被排除在外,所以没有问题。 UserAuthenticationForm:仅包括电子邮件和密码字段。问题是,这应该用于身份验证和验证失败,因为电子邮件已经存在。
有什么办法可以做到这一点吗?也就是说,让 UserAuthenticationForm 跳过电子邮件检查。
谢谢。
【问题讨论】:
这将是一个非常奇怪的调整,以后可能会影响您的代码,为身份验证编写表单并不难。你会更好地遵循编程原则关注点分离 en.wikipedia.org/wiki/Separation_of_concerns,让软件的每个部分都专注于自己的目标。 嗯.. 我不认为逻辑分离是问题。表单正在做一些非常特殊的事情。 我在评论中的意思与您在回答中所做的相同。您有一个用于创建/更新对象的表单,不要将它用于日志用户。仅将其用于创建的内容。 我现在明白了! ;) 我已经在进行更改。谢谢。 【参考方案1】:ModelForms
用于创建/更新对象。身份验证不会修改模型实例(User
),因此请改用普通形式。
来自文档:
save() 方法
ModelForm 生成的每个表单也都有一个 save() 方法。这种方法 从绑定到表单的数据中创建并保存数据库对象。一种 ModelForm 的子类可以接受现有的模型实例作为 关键字参数实例;如果提供,save() 将更新 那个例子。如果未提供, save() 将创建一个新实例 指定型号的。
如果您不打算使用此 save()
方法,并且您也不需要大多数模型字段(仅用户名/电子邮件和密码),那么您将丢弃由ModelForm
,那你为什么要首先使用它呢?
【讨论】:
我同意你的回答,但我认为他不打算使用safe
,只是`验证。
仍然,如何使用它来更新对象?它仍然说电子邮件已经存在。
您将已经存在的对象的实例传递给它,如下所示:form = Form(request.POST, instance=db_object)
嗯.. 我仍然得到“此字段是必需的”。应该这样吗?
@AndréFratelli class Meta: model = User exclude = ['email']
当然是 3 行。以上是关于django 中的 ModelForms 是不是仅用于发布?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django 的 ModelForms 中的标签后添加空格