Python validators=[MinValueValidator]在Django中不工作
我想在Django中设置FloatField的最小值,以便表单字段不接受负值。对于整数,我将数据类型更改为PositiveIntegerField,但对于浮点字段,最小值不起作用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
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,你的答案看起来是正确的,但是如果你添加解释,说明为什么需要这种格式,这将增加清晰度和完整性。