【问题标题】: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 的验证。

我怎样才能做到这一点?

【问题讨论】:

    标签: django validation model


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

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

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

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

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

      不管怎样,看看这个:

      Django: how to cleanup form fields and avoid code duplication

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-06
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 2011-05-15
        • 1970-01-01
        相关资源
        最近更新 更多