Python validators=[MinValueValidator]在Django中不工作

Python validators=[MinValueValidator]在Django中不工作,python,django,Python,Django,我想在Django中设置FloatField的最小值,以便表单字段不接受负值。对于整数,我将数据类型更改为PositiveIntegerField,但对于浮点字段,最小值不起作用 from django.core.validators import MaxValueValidator, MinValueValidator max_discount = models.FloatField( verbose_name=u'Maximum Discount', validators = [MinVa

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

from django.core.validators import MaxValueValidator, MinValueValidator

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

我也做过同样的事情

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)])
我已经这样设置了折扣代码

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)。我们使用此字段的验证器来限制最小和最大接受值

你可以试试这种方法,也许对你有用

谢谢。

您的代码:

from django.core.validators import MaxValueValidator, MinValueValidator

max_discount = models.FloatField( verbose_name=u'Maximum Discount', validators = [MinValueValidator(0.0)])
看起来不错。 你应该注意到

保存模型时,验证程序不会自动运行,但如果 如果您使用的是ModelForm,它将在任何字段上运行您的验证器 包括在您的表格中

有关更多信息,请参阅

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

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

到您的服务器端验证

编辑


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

您的问题在于十进制的定义。 你应该这样做:

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

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

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)

验证器既不使用integerfield也不使用floatfield。我不知道是什么问题。@ManpreetAhluwalia,你在运行你的项目吗?你是一个“virtualenv”项目?如果没有,则使用此选项保护项目目录。有时这会引起问题。我经历过很多次。它可能会自动解决您的问题。谢谢。我刚刚意识到提交表单时验证器可以工作,但我希望该字段不允许像PositiveIntegerField一样输入负值。您的
max\u折扣
字段看起来正常。你说的“不起作用”是什么意思?你想做什么,你期望发生什么,会发生什么?我刚刚意识到当表单提交时验证器会工作,但我希望字段不允许像PositiveIntegerField那样输入负值。oOoo。。。如果提交表单,是否会出现验证消息?但是我希望该字段不允许像PositiveIntegerField那样输入负值。我正在django管理界面上工作,没有模板。嗨,Thomas,你的答案看起来是正确的,但是如果你添加解释,说明为什么需要这种格式,这将增加清晰度和完整性。