【问题标题】:Django DateField format impossible to validate and save to modelDjango DateField 格式无法验证并保存到模型
【发布时间】:2019-04-25 13:09:24
【问题描述】:

老问题,我知道。但我仍然找不到可行的解决方案,所以我可能错过了一些明显的东西。这是我的表格

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."]

[免责声明]我不打算覆盖模型格式约定,我知道日期“真正存储在数据库中”的问题是无关紧要的(不同从一个 DBMS 到另一个;django 模型对此是不可知的)。但这对于完成如此简单的任务来说实在是太难了。为什么我不能:

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

作为一个具有显式格式的 DateField 并提供显式参数这一事实是否足以让验证器了解什么是什么?我错过了什么?

欢迎任何见解

【问题讨论】:

    标签: django datetime django-models django-forms date-format


    【解决方案1】:

    字符\xa0iso8859-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 模块。

    【讨论】:

    • form["birthday"].value() 是一个 str 但 replace(u'\xa0', u'') 方法似乎不起作用:我仍然得到同样的错误:« \xa027/10/1987\xa0» n'est pas valide
    • 问题已解决。谢谢@Chiheb。我天真地认为 form["birthday"].value() 被输入为日期而不是字符串。现在更有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多