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

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

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

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

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

本文链接:https://www.f2er.com/3157651.html

大家都在问