Python 允许向模型传递%d.%m.%Y格式字符串的最佳方式';是DateField吗?

Python 允许向模型传递%d.%m.%Y格式字符串的最佳方式';是DateField吗?,python,django,django-models,python-datetime,Python,Django,Django Models,Python Datetime,我一直在试图了解日期输入格式设置的效果以及Django处理这些数据字段的方式,但我发现的任何内容要么我不理解(对Django来说是比较新的),要么似乎与表单有关,而这在这里似乎不适用 我的用户模型有一个生日字段: class LocalUser(AbstractUser): birthday = models.DateField(blank=True, null=True) 我想从csv创建用户。 我上传csv并处理其内容: class InputFileForm(forms

我一直在试图了解日期输入格式设置的效果以及Django处理这些数据字段的方式,但我发现的任何内容要么我不理解(对Django来说是比较新的),要么似乎与表单有关,而这在这里似乎不适用

我的用户模型有一个生日字段:

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.strtime(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\u导出/import\u数据处的错误

[“'11.02.1993'值的日期格式无效。它必须是YYYY-MM-DD格式。”]


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

日期输入格式与表单相关,因此在保存模型实例时不会进行转换

您可以覆盖模型的
save
方法,并在其中添加必要的转换代码。最好处理
DATE\u INPUT\u 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)

现在,如果您将您的图案添加到
日期输入\u格式
(就像您现在所做的那样),则在保存时会自动进行转换。

非常感谢!这对代码进行了一个小的修改,效果非常好:
self.birth=datetime.strtime(模式,self.birth)
(第一个模式,然后是值);)@麦克斯:没问题。但是我的评论就是这样的。啊,该死的,我在评论中犯了一个错误:我的意思是反过来说,它必须首先是字符串,然后是模式:
self.birth=datetime.strtime(self.birth,pattern)