【问题标题】:Django form.is_valid keeps throwing KeyErrorDjango form.is_valid 不断抛出 KeyError
【发布时间】:2011-11-19 18:15:19
【问题描述】:

我认为有这段代码:

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 在 /

'无效'

代码似乎在is_valid() 调用时崩溃了,这让我有点吃惊,我认为这是安全的(即如果出现问题而不仅仅是崩溃,应该返回False)。我该如何解决这个问题?

堆栈跟踪

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'

【问题讨论】:

    标签: python django django-forms django-1.3 django-validation


    【解决方案1】:

    好的,所以我刚刚确定了它。

    我按照this advice 设置了我的自定义错误消息以进行验证。
    所以我有这个代码:

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

    为所有字段设置相同的必填字段验证消息。

    当错误不同时(invalid 表示非整数),Django 查找我提供的字典 - 猜猜是什么,KeyError。因为那里没有invalid 的消息(这是我的错)。

    所以解决方法是

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

    (可能还有other error message keys

    【讨论】:

      猜你喜欢
      • 2015-11-13
      • 1970-01-01
      • 2011-04-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2022-01-15
      • 2018-08-13
      相关资源
      最近更新 更多