Как проверить поле формы Django, значение которого может увеличиваться только при каждом обновлении? - PullRequest
1 голос
/ 07 декабря 2009

Я создал класс формы на основе модели:

class MyModel(models.Model):
    increasing_field = models.PositiveIntegerField()

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel

Я создал форму для изменения существующего экземпляра MyClass, используя POST Данные для заполнения формы:

m = MyModel.objects.get(pk=n)
f = MyForm(request.POST, instance=m)

Каждый раз, когда f обновляется, f.increasing_field может быть только больше чем предыдущее значение.

Как мне применить эту проверку?

1 способ, которым я могу придумать, - это чтобы clean_increasing_field взял дополнительный аргумент, который представляет предыдущее значение увеличения_поля:

def clean_increasing_field(self, previous_value)
    ...

Таким образом, я могу просто убедиться, что новое значение больше, чем предыдущее значение Но похоже, что методы clean_ () не могут принять дополнительные аргументы.

Есть идеи о том, как провести эту проверку?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2009

Поскольку исходная модель не обновлялась к моменту проверки, вы можете просто посмотреть на текущее (неизменное) значение, используя «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.

2 голосов
/ 07 декабря 2009

Переопределите конструктор вашей формы и удерживайте предыдущее значение:

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, вам придется настроить логику в конструкторе, чтобы учесть это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...