Формат Django DateField невозможно проверить и сохранить в модели - PullRequest
0 голосов
/ 22 ноября 2018

Старая проблема, я знаю.Но я все еще не мог найти рабочее решение, поэтому, возможно, я упустил что-то очевидное.Вот моя форма

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

[ disclaimer ] Я не пытаюсь переопределить соглашение о формате модели и знаю, чтовопрос о том, как даты « действительно хранятся в db » не имеет значения (отличается от одной СУБД к другой; модели django об этом не знают).Но это такая булавка, чтобы бороться с такой простой задачей.Почему я не могу:

  • использовать другой формат для форм и моделей?
  • каким-то образом переопределить этот параметр?

Разве это не фактбудучи DateField с явным форматом, предоставленным с явными параметрами, достаточными для валидатора, чтобы понять, что к чему?Чего мне не хватает?

Любое понимание приветствуется

1 Ответ

0 голосов
/ 23 ноября 2018

Символ \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.

...