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 中的标签后添加空格

显示 ModelForms 的 django 表单验证错误

Django的Modelforms的介绍

django ModelForms - 我做对了吗?

在 ModelForms 中继承 formfield_callback 的 Django 问题

在 ModelForms 中继承 formfield_callback 的 Django 问题