Django datetime не проверяет право

Я использую тип ввода 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.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
2 959
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

у вас просто опечатка. Сделайте это 'form' вместо 'fom' в значении класса.

'календарь': forms.Select (attrs = { 'класс': 'fom-control selected-select' }),

спасибо за опечатку, но ошибка не в этом (стиль немного отличается). Ошибка из полей start и end

robotHamster 06.11.2018 23:02

В классе формы, классе модели или самом виджете?

robotHamster 06.11.2018 23:27

Я добавил localize=True в init в поля ... почти то же самое

robotHamster 06.11.2018 23:30

localize должен идти сразу после формата, через запятую. Можете ли вы отследить данные как на передней, так и на конечной стороне для сравнения?

dp2050 06.11.2018 23:31
localize=True сразу после ошибок format='%Y-%m-%dT%H:%M' как unexpected keyword argument
robotHamster 06.11.2018 23:33

Возможно, вам нужно import datetime, чтобы убедиться, что это допустимый формат даты / времени для python, здесь вы можете увидеть aproach.

Я импортировал datetime в views.py, проверка по-прежнему возвращает то же самое

robotHamster 06.11.2018 23:26
Ответ принят как подходящий

Заблуждение:

Процитируем документы:

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)?

robotHamster 08.11.2018 08:13

Нет, если вы предоставите правильный формат любым способом, метод clean поля выдаст экземпляр datetime.datetime, который форма должна правильно сохранить. Я внес некоторые правки в ответ, включая некоторые очень важные детали: 1) это input_formats, а не input_format 2) input_formats должен быть итерабельным (или он, что довольно сбивает с толку, вызовет ValidationError). Я настоятельно рекомендую подход с настройками.

CoffeeBasedLifeform 08.11.2018 17:46

Другие вопросы по теме