我正在尝试在我的模型中的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的值。 我不想限制数据库级别因为我不想在这方面限制自己。
答案 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'})