【发布时间】:2020-01-13 00:43:19
【问题描述】:
我创建了一个上传 xlsx 函数,在其中我解析每一行并将每一行数据添加到字典中,之后我用一个表单验证这个字典,在这个表单中我有一个 DateField,如果在 xlsx 单元格中有一个正确格式化日期,因为我在我的字段中要求一切正常,表格有效,我可以做任何我想做的事情,但如果单元格的格式化日期不正确,则会引发此错误:
Internal Server Error: /core/process_upload_file
Traceback (most recent call last):
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 106, in _get_response
response = middleware_method(request, callback, callback_args, callback_kwargs)
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/debug_toolbar/middleware.py", line 85, in process_view
response = panel.process_view(request, view_func, view_args, view_kwargs)
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/debug_toolbar/panels/profiling.py", line 160, in process_view
return self.profiler.runcall(view_func, *args, **view_kwargs)
File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py", line 109, in runcall
return func(*args, **kw)
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Users/alex/Documents/Projects/Django/platform/application/core/views.py", line 567, in process_upload_file
if form.is_valid():
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/forms/forms.py", line 185, in is_valid
return self.is_bound and not self.errors
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/forms/forms.py", line 180, in errors
self.full_clean()
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/forms/forms.py", line 381, in full_clean
self._clean_fields()
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/forms/forms.py", line 399, in _clean_fields
value = field.clean(value)
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/forms/fields.py", line 148, in clean
value = self.to_python(value)
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/forms/fields.py", line 410, in to_python
return super().to_python(value)
File "/Users/alex/Documents/Projects/Django/platform/venv/lib/python3.6/site-packages/django/forms/fields.py", line 386, in to_python
raise ValidationError(self.error_messages['invalid'], code='invalid')
KeyError: 'invalid'
这是表单域:
date = forms.DateField(input_formats=['%d.%m.%Y'], widget=forms.DateInput(format='%d.%m.%Y'))
我想抛出一个格式不正确的验证错误,但从我看来,django 试图抛出这个无效的验证错误,但它不存在。我不能用 clean_field() 来做,因为该字段会在它到达我的 clean 函数之前验证它的格式。
因此,例如,如果单元格值为:22.02.2020,则可以,但如果是 22/02/2020,则会引发 500 错误。不知道为什么。我希望有人解释一下,也许能给我一个解决方案。
【问题讨论】:
-
您显然只允许
%d.%m.%Y作为输入格式,所以其他所有内容都无效。 -
好的,我明白了,但我不应该从 django 得到一个无效的格式验证错误,而不是抛出一个普通的 500 错误吗?
-
你的
core/views.py,第 567 行,process_upload_file函数没有捕捉到ValidationError,所以它冒泡成 500 错误。 -
不,我发现了问题,因为我让这个项目是我的语言,我重写了 error_messages,我这样做是为了将所需的消息更改为我的语言,就像 init的形式一样> 功能:
for field in self.fields: self.fields[field].error_messages = { 'required': 'Acest câmp este obligatoriu.', },但这样做会覆盖它并让无效消息发出。 -
@alex: 你可以用
self.fields[field].error_messages['required'] = '...'设置错误信息
标签: django django-forms django-validation