模型验证。不想重复自己。姜戈
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
创建的ModelForm
。 M
定义了
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
【讨论】:
以上是关于模型验证。不想重复自己。姜戈的主要内容,如果未能解决你的问题,请参考以下文章