Django Modelform在FloatField上设置最小值

时间:2017-01-17 15:38:33

标签: python django constraints modelform

我正在尝试在我的模型中的Form级别设置min_value属性。

Forms.py

class User < ActiveRecord::Base
  scope :pry_scope, ->{ select(User.attribute_names - ['avatar', 'permalink']) }
  ...
end

Model.py

> User.pry_scope.last

如何设置我可以约束模型允许的值的模型? 我希望用户只输入大于或等于0.01的值。 我不想限制数据库级别因为我不想在这方面限制自己。

3 个答案:

答案 0 :(得分:3)

除了在widget上设置'min'属性外,还覆盖form的clean_fieldname()方法:

class ProductForm(forms.models.ModelForm):

        def __init__(self, *args, **kwargs):
            super(ProductForm, self).__init__(*args, **kwargs)
            self.fields['price'].widget.attrs['min'] = 0.01


        def clean_price(self):
            price = self.cleaned_data['price']
            if price < 0.01:
                raise forms.ValidationError("Price cannot be less than 0.01")
            return price

        class Meta:
            model = Artikel
            localized_fields = '__all__'
            fields = ('price',)

Doc说:

  

在表单子类上调用clean_<fieldname>()方法 - 其中将替换为表单字段属性的名称。此方法执行特定于该特定属性的任何清理,与其所属的字段类型无关。此方法未传递任何参数。您需要在self.cleaned_data中查找该字段的值,并记住此时它将是一个Python对象,而不是表单中提交的原始字符串(它将在cleaning_data中,因为一般字段clean()方法,上面,已经清理了一次数据。)

答案 1 :(得分:2)

您可以覆盖ModelForm的init方法。这会将字段上的min属性设置为10:

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        self.fields['price'].widget.attrs['min'] = 10

答案 2 :(得分:0)

执行此操作的简单方法是在字段上设置验证程序并提供自定义错误消息:

class ProductModelForm(forms.ModelForm):
   price = forms.FloatField(min_value=0.01,
                            errors={'min_value': u'Price cannot be less than 0.01'})