【问题标题】:Use Django model IntegerField validator values on the form在表单上使用 Django 模型 IntegerField 验证器值
【发布时间】:2017-04-21 05:09:48
【问题描述】:

我可以在模型上设置最小值验证器:

class MyModel(Model):
    my_field = models.fields.IntegerField(default=250, validators=[MinValueValidator(30)])

然后我使用之前的模型创建一个表单:

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ('my_field',)

表单得到验证,显示正确的错误消息(当输入的值

我能够通过(再次)在表单上指定最小值来使其工作:

class MyForm(ModelForm):
    my_field = form.IntegerField(min_value=30)

    class Meta:
        model = MyModel
        fields = ('my_field',)

但是这种方式代码并不枯燥——我需要指定两次值和字段类型。

有什么办法可以避免这种情况吗?或者至少从模型验证器中获取 min_value?

【问题讨论】:

    标签: django validation django-models django-forms


    【解决方案1】:

    验证器与保存模型没有任何关系 - 除了在保存之前应该检查它们。

    docs

    请注意,当您保存模型时,验证器不会自动运行,但如果您使用的是 ModelForm,它将在您的表单中包含的任何字段上运行您的验证器。

    要么确保您严格限制创建对象的方式,要么您可能需要覆盖 save 或提供pre_save signal

    【讨论】:

    • 感谢您的回答。为什么“form_invalid”会被触发,说“出了点问题”,但实例还是被保存了?
    • @Julius - 这与验证器无关,它很可能是您自己代码中的错误,form_invalid 不会调用保存
    • @Julius - 在黑暗中随机刺伤,但我猜你的 form_invalid 正在打电话给 super.form_valid
    • 不,它没有 - 已经检查过:) 我想我找到了问题...我的实例是从站点引用的,也就是说,我的 get_form 看起来像这样:return form_class(instance=get_current_site (self.request).configuration, **self.get_form_kwargs()) 现在我相信更改的值已设置并保留,直到我重新启动服务器。有没有办法重置表格?
    • @Julius - 这将是一个不同的问题,如果需要,您应该为此提出一个新问题
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2017-06-14
    • 2012-05-02
    相关资源
    最近更新 更多