Python 允许向模型传递%d.%m.%Y格式字符串的最佳方式';是DateField吗?
我一直在试图了解日期输入格式设置的效果以及Django处理这些数据字段的方式,但我发现的任何内容要么我不理解(对Django来说是比较新的),要么似乎与表单有关,而这在这里似乎不适用 我的用户模型有一个生日字段: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
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)