【问题标题】:Djando DateField throws 'invalid'Django DateField 抛出“无效”
【发布时间】: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


【解决方案1】:

因为它在表单 clean_field 验证之前在模型中进行验证。

在模型中,日期字段是以settings.py文件中指定的格式保存的数据

USE_L10N = False

DATE_INPUT_FORMATS = ['%d-%m-%Y',
                      '%d/%m/%Y',
                      '%d.%m.%Y'] 

在form.py中

from django.conf import settings
date = forms.DateField(input_formats=settings.DATE_INPUT_FORMATS, widget=forms.DateInput(format='%d.%m.%Y'))

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 2019-09-05
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2012-06-13
    • 2019-06-11
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多