python - 允许将 %d.%m.%Y 格式的字符串传递给模型的 DateField 的最佳方法?
问题描述
我一直在尝试了解 DATE_INPUT_FORMATS 设置的影响以及 Django 处理这些数据字段的方式,但无论我发现什么对我来说都是无法理解的(对 DJango 来说相对较新),或者似乎与 Forms 相关,这似乎不是适用于此。
我的用户模型有一个生日字段:
class LocalUser(AbstractUser):
birthday = models.DateField(blank=True, null=True)
我想从 csv 创建用户。我上传 csv 并处理其内容:
class InputFileForm(forms.Form):
file = forms.FileField()
def process_file(self):
file = io.TextIOWrapper(self.cleaned_data['file'].file, encoding='utf-8-sig')
reader = csv.DictReader(file, delimiter=";")
l = LocalUser(**dict(line))
l.save()
csv 包含例如“01.01.1999”格式的日期。当我重新格式化日期时它可以工作,例如通过,line["birthday"] = datetime.strptime(line["birthday"], '%d.%m.%Y')
但我确信必须有一个更好的解决方案,一个我不必修改代码,只要生日作为字符串传递给用户模型。
在 settingy.py 文件中我添加了:
#USE_L10N = False
from django.conf.global_settings import DATE_INPUT_FORMATS
DATE_INPUT_FORMATS += ('%d.%m.%Y',)
但这无济于事。
我得到的错误信息是:
/import_export/import_data 处的验证错误
["'11.02.1993' 值的日期格式无效。它必须是 YYYY-MM-DD 格式。"]
你对如何解决这个问题有什么建议吗?
解决方案
与DATE_INPUT_FORMATS
表单有关,因此在保存模型实例时不会进行转换。
您可以覆盖save
模型的方法并在那里添加必要的转换代码。最好处理中提到的所有模式DATE_INPUT_FORMATS
以保持共同的事实来源:
from datetime import datetime
from django.conf import settings
from django.core.exceptions import ValidationError
class LocalUser(AbstractUser):
birthday = models.DateField(blank=True, null=True)
def save(self, *args, **kwargs):
if self.birthday is not None:
if isinstance(self.birthday, str):
for pattern in settings.DATE_INPUT_FORMATS:
try:
self.birthday = datetime.strptime(self.birthday, pattern)
break
except ValueError:
continue
else:
raise ValidationError('Not a valid date string')
super().save(*args, **kwargs)
现在,如果您添加了您的模式(DATE_INPUT_FORMATS
就像您现在所做的那样),则会在保存时进行自动转换。
推荐阅读
- javascript - Javascript,不知道元素名称的目标数据
- coq - 在 Coq/Ssreflect 中将 finset 转换为 finType
- python-3.x - python 类如何具有在调用时给出可变结果的变量属性?
- javascript - 您能否为您在脚本中使用 jquery 和 ajax 进行的每次交互创建不同的 url?
- java - sbt 增量编译在 Java 11 中不起作用
- python - 如何从 MNIST 获取 Top Errors?
- r - R将滞后变量添加到sarima模型
- eclipse - “Eclipse Tools for IBM Cloud”或“Eclipse Tools for BlueMix”是否仍然存在/可供下载?
- reactjs - 将新用户注册到数据库后重定向不起作用(快递,猫鼬,反应)
- c++ - 如何启动 UMDF IddCx 显示驱动程序来模拟假显示器?