Я использую тип ввода HTML5 datetime-local, чтобы попытаться получить данные даты и времени в мою базу данных.
ModelFormclass Meta: выглядит следующим образом:
class Meta:
model = ScheduleEntry
fields = ['calendar', 'title', 'start', 'end', 'assets', 'users']
widgets = {
'calendar': forms.Select(attrs = {
'class': 'fom-control chosen-select'
}),
'title': forms.TextInput(attrs = {
'class': 'form-control'
}),
'start': forms.DateTimeInput(attrs = {
'type':'datetime-local',
'class':'form-control'
}, format='%Y-%m-%dT%H:%M'),
'end': forms.DateTimeInput(attrs = {
'type': 'datetime-local',
'class': 'form-control'
}, format='%Y-%m-%dT%H:%M'),
'assets': forms.SelectMultiple(attrs = {
'class': 'form-control chosen-select'
}),
'users': forms.SelectMultiple(attrs = {
'class': 'form-control chosen-select',
})
}
Я продолжаю терпеть неудачу при проверке формы, и это заставляет меня выдергивать волосы.Это страница документации, которая показывает, что она должна работать, но похоже, что я что-то упускаю?
РЕДАКТИРОВАТЬ ДЛЯ УТОЧНЕНИЯ:
Сообщение об ошибке предназначено как для start, так и для end, и это Enter a valid date/time.






у вас просто опечатка. Сделайте это 'form' вместо 'fom' в значении класса.
'календарь': forms.Select (attrs = { 'класс': 'fom-control selected-select' }),
В классе формы, классе модели или самом виджете?
Я добавил localize=True в init в поля ... почти то же самое
localize должен идти сразу после формата, через запятую. Можете ли вы отследить данные как на передней, так и на конечной стороне для сравнения?
localize=True сразу после ошибок format='%Y-%m-%dT%H:%M' как unexpected keyword argumentВозможно, вам нужно import datetime, чтобы убедиться, что это допустимый формат даты / времени для python, здесь вы можете увидеть aproach.
Я импортировал datetime в views.py, проверка по-прежнему возвращает то же самое
Процитируем документы:
Widgets should not be confused with the form fields. Form fields deal with the logic of input validation and are used directly in templates. Widgets deal with rendering of HTML form input elements on the web page and extraction of raw submitted data.
Виджеты не влияют на проверку. Вы указали своим виджетам аргумент формата, но это не означает, что проверка поля формы будет использовать его - он устанавливает только исходный формат, в котором отображается содержимое виджета:
format: The format in which this field’s initial value will be displayed.
Два варианта:
укажите в поле формы (forms.DateTimeField) формат даты и времени, который вы хотели бы использовать, передав аргумент input_formats
class MyIdealDateForm(forms.ModelForm):
start = forms.DateTimeField(
input_formats = ['%Y-%m-%dT%H:%M'],
widget = forms.DateTimeInput(
attrs = {
'type': 'datetime-local',
'class': 'form-control'},
format='%Y-%m-%dT%H:%M')
)
Это необходимо сделать для каждого поля формы (и, возможно, даже для их виджетов). То, что вы здесь делаете, фактически перезаписывает настройки (см. Следующий пункт).
Добавьте свой формат даты и времени в настройки в качестве первого элемента. Это будет применяться глобально ко всем полям форм и виджетам, которые используют этот параметр.
Спасибо очень! за разъяснения. Прежде чем я приму это как ответ: правильно ли я предполагаю, что вышеупомянутое решение делает подразумевает, что мне придется обрабатывать сохранение дат в моем коде представления, чтобы form.save() не позаботился об этом полностью (что IMHO является самым большим преимуществом использования ModelForm)?
Нет, если вы предоставите правильный формат любым способом, метод clean поля выдаст экземпляр datetime.datetime, который форма должна правильно сохранить. Я внес некоторые правки в ответ, включая некоторые очень важные детали: 1) это input_formats, а не input_format 2) input_formats должен быть итерабельным (или он, что довольно сбивает с толку, вызовет ValidationError). Я настоятельно рекомендую подход с настройками.
спасибо за опечатку, но ошибка не в этом (стиль немного отличается). Ошибка из полей
startиend