模型验证。不想重复自己。姜戈

Posted

技术标签:

【中文标题】模型验证。不想重复自己。姜戈【英文标题】:Model validation. Don't want to repeat myself. Django 【发布时间】:2011-11-24 12:35:04 【问题描述】:

我有一个模型 M,它有一个字段 num=models.IntegerField() 我有一个名为 F 的模型表单,用于模型 M。 我想确保 num 永远不会是负数。

如果我在表单类F 中进行验证,那么我可以在clean_num() 中进行验证: 如果为负,则抛出ValidationError('Num can never be negative')。 此ValidationError 将通过以下方式自动重新显示给用户 将他重定向回他提交并显示的表单 num 字段顶部的“Num 永远不会是负数”消息。 这一切都是由 django 自动完成的,只要我抛出 ValidationError 来自 clean_fieldname 方法。

我希望能够做到所有这些,但在模型类中。

F 是从模型类M 创建的ModelFormM 定义了 num 字段永远不能为负数。

当我在表单上调用is_valid() 时,我想要模型中定义的函数 检查任何引用此模型的ModelForm 的验证。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

请参阅Model validation(仅限 Django 1.2+)。

【讨论】:

【参考方案2】:

您也可以使用PositiveIntegerField 来解决这个特定问题。

如果您的验证仅依赖于字段值,您可以实现自己的字段类型,如下所述:https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

【讨论】:

注意正数!=非负数。 在 django 中,PositiveIntegerField 也可以包含零值,因为它在数据库级别实现为 unsigned int。这也在这里讨论过:***.com/questions/2248617/…【参考方案3】:

感谢所有发布答案的人。但我找到了我所问的内容,所以如果你有兴趣:

您可以为模型定义一次正确的验证器。所有使用此模型的表单都会将 ValidationError('cant use this name') 附加到它们的 field_name.errors 列表中。

请注意,它们将被添加到正在运行模型字段验证器的表单中。

不管怎样,看看这个:

Django: how to cleanup form fields and avoid code duplication

【讨论】:

以上是关于模型验证。不想重复自己。姜戈的主要内容,如果未能解决你的问题,请参考以下文章

验证没有模型的电子邮件蛋糕 1.2 [重复]

OperationalError,没有这样的列。姜戈

训练模型:交叉验证

asp.net mvc 中模型验证如何处理数组呢?

如何使用表单验证防止重复提交

验证电子邮件域 [重复]