Django DateField格式无法验证并保存到模型中



我知道老问题。但我仍然找不到一个有效的解决方案,所以我可能错过了一些显而易见的东西。这是我的表单

class AddPatientForm(forms.Form):
last_name = forms.CharField(label='Nom', max_length=40)
first_name = forms.CharField(label='Prénom', max_length=40)
birthday = forms.DateField(label='date de naissance',
widget=forms.DateInput(format='%d/%m/%Y',attrs={'placeholder': '31/03/1989'}),
input_formats=['%d/%m/%Y',])

它遵循这种格式约定,必须这样做。这是我的模型

class Patients(models.Model):
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
birth_date = models.DateField()
inscription = models.DateTimeField(auto_now_add=True)

以下是我在设置.py中尝试的方法,以解决问题

DATE_FORMAT = "d-m-Y"
DATE_INPUT_FORMATS = ['%d-%m-%Y']
USE_L10N = False

尽管如此,我还是遇到了同样的问题:

form = AddPatientForm(request.POST)
if form.is_valid():
form.clean()
d = Patients(first_name= form["first_name"].value(), 
last_name= form["last_name"].value(),
birth_date= form["birthday"].value())
d.save()
>>>>["Le format de date de la valeur «xa027/10/1987xa0» n'est pas valide. Le format correct est AAAA-MM-JJ."]

[免责声明]我不想覆盖模型格式约定,我知道日期">如何真正存储在db中"的问题是无关紧要的(不同于一个DBMS;django模型对此是不可知的(。但这是一个棘手的问题,要在这么简单的任务中挣扎。为什么我不能:

  • 对表单和模型使用不同的格式
  • 以某种方式覆盖此参数

作为一个具有显式格式的DateField,并提供显式参数,这难道不足以让验证器理解什么是什么吗?我错过了什么?

任何见解都欢迎

特征xa0iso8859-1编码有关。这里有一个例子:

>>> a = b'xa027/10/1987xa0'
>>> a.decode('iso8859-1').strip()
'27/10/1987'

因此,在您的问题中,如果birth_date= form["birthday"].value()bytes对象,您需要首先将其解码为具有有效日期格式的常规字符串,以便进一步操作:

birth_date = form["birthday"].value().decode('iso8859-1')

否则,如果birth_date的类型是字符串,您可以轻松地执行:

birth_date = form["birthday"].value().replace(u'xa0', u'')

然后,为了将日期存储在数据库中,您需要一个有效的datetime对象。您可以将字符串转换为有效的Python日期时间对象,例如:

>>> from datetime import datetime
>>> datetime.strptime('27/10/1987', '%d/%m/%Y')
datetime.datetime(1987, 10, 27, 0, 0)

奖励:如果您需要一个可感知的datetime对象,可以考虑使用pytz模块。