我想在Django中设置FloatField的最小值,以便表单字段不接受负值。在整数的情况下,我将数据类型更改为PositiveIntegerField,但在float字段的情况下,最小值不起作用。
from django.core.validators import MaxValueValidator, MinValueValidator
max_discount = models.FloatField( verbose_name=u'Maximum Discount', validators = [MinValueValidator(0.0)])
答案 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'))]