我基于模型创建了一个表单类:
class MyModel(models.Model):
increasing_field = models.PositiveIntegerField()
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
我创建了一个表单来使用POST更改现有的MyClass实例 填写表格的数据:
m = MyModel.objects.get(pk=n)
f = MyForm(request.POST, instance=m)
每次更新f时,f.increasing_field只能更大 比以前的值。
如何执行该验证?
我能想到的一种方法是让clean_increasing_field承担额外的费用 表示increase_field的前一个值的参数:
def clean_increasing_field(self, previous_value)
...
这样我可以确保新值大于 以前的价值。但它看起来像clean_()方法不能 承担额外的争论。
有关如何进行此验证的任何想法?
答案 0 :(得分:3)
由于在完成验证时尚未更新原始模型,因此您只需使用“self.instance.increasing_value”(或调用任何字段)查看当前(未更改的)值。将此值与要验证的新值进行比较,如果不高于当前值,则引发错误。
def clean_increasing_field(self):
new_val = self.cleaned_data['increasing_field']
if new_val <= self.instance.increasing_field:
raise forms.ValidationError("Increasing Field must increase!")
return new_val #must always return the data
注意:self.instance将返回ModelForm绑定的基础模型。
答案 1 :(得分:2)
覆盖表单的构造函数并保留上一个值:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs) # call super class
instance = kwargs['instance']
self.previous_value = instance.increasing_field
def clean_increasing_field(self):
value = self.cleaned_data['increasing_field']
if self.previous_value >= value:
raise forms.ValidationError, 'Increasing value can only increase'
return value
class Meta:
model = MyModel
上面的代码假定您在实例化表单时总是有一个实例。如果您重复使用表单初始创建MyModel
,则必须调整构造函数中的逻辑以将其考虑在内。