如何验证Django表单字段,其值只能在每次更新时增加?

时间:2009-12-07 03:55:55

标签: django django-forms

我基于模型创建了一个表单类:

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_()方法不能 承担额外的争论。

有关如何进行此验证的任何想法?

2 个答案:

答案 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,则必须调整构造函数中的逻辑以将其考虑在内。