允许%d。%m。%Y格式的字符串传递给模型的DateField的最佳方法?

时间:2019-11-05 17:21:17

标签: python django django-models python-datetime

我一直在尝试了解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格式。”]

您对如何解决此问题有任何建议吗?

1 个答案:

答案 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中(就像现在一样),则将在保存时进行自动转换。