我一直在尝试了解DATE_INPUT_FORMATS设置的效果以及Django处理这些datfields的方式,但是我发现的内容对我而言不是很稳定(对于DJango而言相对较新),或者似乎与Forms有关,而与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包含e中的日期。 G。 “ 01.01.1999”格式。当我重新格式化日期e时,它起作用。 G。通过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中的ValidationError
[“'11.02.1993'值的日期格式无效。它必须为YYYY-MM-DD格式。”]
您对如何解决此问题有任何建议吗?
答案 0 :(得分:1)
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
中(就像现在一样),则将在保存时进行自动转换。