Django DateField 格式无法验证并保存到模型
Django DateField format impossible to validate and save to model
老问题,我知道了。但我仍然找不到有效的解决方案,所以我可能错过了一些明显的东西。这是我的表格
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)
这是我在 setting.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/1987\xa0» n'est pas valide. Le format correct est AAAA-MM-JJ."]
[免责声明]我不想覆盖模型格式约定,我知道日期“如何真正存储在 db" 是无关紧要的(从一个 DBMS 到另一个 DBMS;django 模型对此不可知)。但是,要完成如此简单的任务,这实在是太麻烦了。为什么我不能:
- 表格和模型使用不同的格式?
- 以某种方式覆盖此参数?
DateField 具有显式格式并提供显式参数这一事实是否足以让验证器了解什么是什么?我错过了什么?
欢迎任何见解
字符\xa0
与iso8859-1
编码有关。这是一个例子:
>>> a = b'\xa027/10/1987\xa0'
>>> 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)
好处: 如果你需要一个有意识的日期时间对象,考虑使用 pytz
模块。
老问题,我知道了。但我仍然找不到有效的解决方案,所以我可能错过了一些明显的东西。这是我的表格
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)
这是我在 setting.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/1987\xa0» n'est pas valide. Le format correct est AAAA-MM-JJ."]
[免责声明]我不想覆盖模型格式约定,我知道日期“如何真正存储在 db" 是无关紧要的(从一个 DBMS 到另一个 DBMS;django 模型对此不可知)。但是,要完成如此简单的任务,这实在是太麻烦了。为什么我不能:
- 表格和模型使用不同的格式?
- 以某种方式覆盖此参数?
DateField 具有显式格式并提供显式参数这一事实是否足以让验证器了解什么是什么?我错过了什么?
欢迎任何见解
字符\xa0
与iso8859-1
编码有关。这是一个例子:
>>> a = b'\xa027/10/1987\xa0'
>>> 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)
好处: 如果你需要一个有意识的日期时间对象,考虑使用 pytz
模块。