Django form.is_valid продолжает бросать KeyError - PullRequest
1 голос
/ 18 сентября 2011

У меня есть этот код в моем представлении:

def add_intern(request):
    if request.method == 'POST':
        form = InternApplicationForm(request.POST)
        if form.is_valid():
            form.save()
            form = InternApplicationForm()
    else:
        form = InternApplicationForm()

    return render_to_response('application.html', {'form': form},
                              context_instance = RequestContext(request))

Форма - ModelForm, а базовая модель содержит IntegerField.
Когда я публикую форму с пустым значением,сообщение проверки отображается очень хорошо.

Когда я отправляю форму с нецелым значением , я получаю это:

KeyError at /

'invalid'

Меня как-то удивляет то, что код кажется сбойным при вызове is_valid(), который, как я предположил, безопасен (то есть должен возвращать False, если есть проблемаи не просто сбой).Как мне это исправить?

Stacktrace

Django Version: 1.3
Python Version: 2.6.5

File "/usr/local/lib/python2.6/dist-packages/Django-1.3-py2.6.egg/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/dan/www/ints/backend/views.py" in add_intern
  14.         if form.is_valid():
File "/usr/local/lib/python2.6/dist-packages/Django-1.3-py2.6.egg/django/forms/forms.py" in is_valid
  121.         return self.is_bound and not bool(self.errors)
File "/usr/local/lib/python2.6/dist-packages/Django-1.3-py2.6.egg/django/forms/forms.py" in _get_errors
  112.             self.full_clean()
File "/usr/local/lib/python2.6/dist-packages/Django-1.3-py2.6.egg/django/forms/forms.py" in full_clean
  267.         self._clean_fields()
File "/usr/local/lib/python2.6/dist-packages/Django-1.3-py2.6.egg/django/forms/forms.py" in _clean_fields
  284.                     value = field.clean(value)
File "/usr/local/lib/python2.6/dist-packages/Django-1.3-py2.6.egg/django/forms/fields.py" in clean
  169.         value = self.to_python(value)
File "/usr/local/lib/python2.6/dist-packages/Django-1.3-py2.6.egg/django/forms/fields.py" in to_python
  248.             raise ValidationError(self.error_messages['invalid'])

Exception Type: KeyError at /
Exception Value: 'invalid'

1 Ответ

4 голосов
/ 18 сентября 2011

Хорошо, поэтому я просто прибил его.

Я следовал этому совету , чтобы установить свое собственное сообщение об ошибке для проверки.
Итак, у меня был этот код:

def __init__(self, *args, **kwargs):
    super(InternApplicationForm, self).__init__(*args, **kwargs)
    for field in self.fields.values():
        field.error_messages = {'required':'*'}

, которые устанавливают одно и то же обязательное сообщение для проверки полей для всех полей.

Когда ошибка была другой (invalid для нецелого числа), Джанго посмотрел в предоставленном мною словаре - и угадайте, что,KeyError.Потому что там нет сообщения для invalid (и это моя ошибка).

Итак, исправление

        field.error_messages = {'required': '*', 'invalid': "That's not a number, sir."}

(и, возможно, другие ключи сообщений об ошибках )

...