validators = [MinValueValidator]在Django中不起作用

时间:2017-05-17 10:18:20

标签: python django

我想在Django中设置FloatField的最小值,以便表单字段不接受负值。在整数的情况下,我将数据类型更改为PositiveIntegerField,但在float字段的情况下,最小值不起作用。

from django.core.validators import MaxValueValidator, MinValueValidator

max_discount = models.FloatField( verbose_name=u'Maximum Discount', validators = [MinValueValidator(0.0)])

4 个答案:

答案 0 :(得分:2)

您的代码:

from django.core.validators import MaxValueValidator, MinValueValidator

max_discount = models.FloatField( verbose_name=u'Maximum Discount', validators = [MinValueValidator(0.0)])

看起来很好。 你应该注意到

  保存模型时,

验证程序不会自动运行,但是如果   如果您使用的是ModelForm,它将在任何字段上运行验证程序   包含在您的表单中。

有关详细信息,请参阅docs

您也可以在表单中添加某种html属性验证,例如:

<input type="number" min="0.0">

到服务器端验证。

修改

如果您的表单字段位于管理界面中,则可以自定义此字段的窗口小部件(基本上是HTML)。您可以看到here如何将自定义窗口小部件添加到管理界面中的字段。

答案 1 :(得分:1)

我做过同样的事情,

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

class Coupon(models.Model):
    code = models.CharField(max_length=50,
                               unique=True)
    valid_from = models.DateTimeField()
    valid_to = models.DateTimeField()
    discount = models.IntegerField(
                      validators=[MinValueValidator(0),
                                  MaxValueValidator(100)])
    active = models.BooleanField()
    def __str__(self):
        return self.code

我已经设置了这样的折扣码,

discount = models.IntegerField(
                          validators=[MinValueValidator(0),
                                      MaxValueValidator(100)])

折扣:要应用的折扣率(这是一个百分比,因此从0到100取值)。我们在此字段中使用验证器来限制最小和最大可接受值。

你可以尝试这种方式可能适合你。

感谢。

答案 2 :(得分:0)

您可以创建自己的 PositiveFloatField 来扩展 FloatField 并根据需要对其进行自定义

class PositiveFloatField(FloatField):
description = _("Positive Float")

@cached_property
def validators(self):
    validators_ = super().validators

    validators_.append(validators.MinValueValidator(0.0))
    return validators_

def formfield(self, **kwargs):
    return super().formfield(**{
        'min_value': 0.0,
        **kwargs,
    })

然后在您的模型中:

height = PositiveFloatField(verbose_name=_("Height"), null=True, blank=True)

答案 3 :(得分:-1)

您的问题在于小数的定义。 您应该这样:

validators = [MinValueValidator(Decimal('0.0'))]