Проверка формы Django на пустом IntegerField

У меня есть форма, которую я не отображаю как часть HTML-страницы, но проверяю ввод:

class milestone_form(forms.Form):
    name = forms.CharField(required=True)
    completion = forms.IntegerField(initial=0, required=False)
    due_date = forms.DateField(required=True,input_formats={'%d.%m.%Y'})
    phase = forms.IntegerField(required=True)

этот бит завершения вызывает много проблем:

form = milestone_form(request.POST)
form.is_valid()#will return False on empty completion

Я попытался переопределить форму clean(), чтобы сделать завершение = 0, когда оно пусто:

def clean(self):
    cleaned_data = self.cleaned_data
    if cleaned_data.get('completion') is None:
        cleaned_data['completion'] = 0
    return cleaned_data 

Однако это не помогает. Есть ли что-то еще, что мне не хватает?


person abolotnov    schedule 31.03.2012    source источник
comment
Вы должны включить input для завершения в форму, но использовать виджет HiddenInput, чтобы он не отображался.   -  person Timmy O'Mahony    schedule 31.03.2012
comment
Я запустил код, который вы дали, и он работает нормально для меня. Сообщается, что форма действительна, если завершение равно None или отсутствует в массиве POST. Также попытка изменить значение завершения в методе очистки формы бесполезна, поскольку это последняя функция, которая вызывается в цепочке проверки и очистки. Взгляните на: docs.djangoproject.com/en/1.3/ref/forms/validation/   -  person abhaga    schedule 31.03.2012
comment
это реальный ввод, доступный для ввода - я просто хочу, чтобы он был «0», когда поле пусто.   -  person abolotnov    schedule 31.03.2012
comment
@abhaga, тебе повезло :) у меня это не работает: <ul class="errorlist"><li>completion<ul class="errorlist"><li>Enter a whole number.</li></ul></li></ul> хотя отладка формы показывает completion = {int} 0   -  person abolotnov    schedule 01.04.2012


Ответы (1)


Вероятно, я бы возвращал целое число для пустого поля с проверкой ошибок:

from django.forms import ValidationError

def clean_completion(self):
    if self.cleaned_data.get('completion'):
        try:
            return int(self.cleaned_data['completion'].strip())
        except ValueError:
            raise ValidationError("Invalid number")
    return 0
person Jeff Bauer    schedule 31.03.2012
comment
Однако clean_completion не попадает - person abolotnov; 01.04.2012
comment
если я использую это определение в качестве валидатора поля, форма все равно будет недействительной и вернет enter a whole number, хотя completion = {int}0 - person abolotnov; 01.04.2012