首页 > 解决方案 > 允许将 %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 格式。"]

你对如何解决这个问题有什么建议吗?

标签: pythondjangodjango-modelspython-datetime

解决方案


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就像您现在所做的那样),则会在保存时进行自动转换。


推荐阅读