Изменение формата DatePicker вызывает ошибки проверки - PullRequest
1 голос
/ 01 августа 2020

Я использую средство выбора даты и времени, где пользователь выбирает месяц (MonthPickerInput).

models.py

birthdayMonth = models.DateField(null=True, default=now)

forms.py

from bootstrap_datepicker_plus import MonthPickerInput

class QuestionForm(forms.ModelForm):

    widgets = {
        'birthdayMonth': MonthPickerInput(
            options={
                "showClose": False,
                "showClear": False,
                "showTodayButton": False,
            }
        ),
    }

Пользователь нажимает на поле формы, открывается календарь, и они выбирают месяц и год. MonthPicker автоматически устанавливает день равным «1». Это нормально для серверной части, но в форме, заполняемой пользователем, она отображается как 2020-03-01. Вместо этого я бы хотел, чтобы он отображался так March 2020 (03-2020 тоже подойдет). Для этого я добавил поле в format в froms.py:

widgets = {
    'birthdayMonth': MonthPickerInput(
        options={
            "format":"MMMM, YYYY",
        }
    ),
}

Это отображается правильно во внешнем интерфейсе, однако проверка формы всегда не выполняется (всякий раз, когда я отправляю форму, ввод календаря выделяется красный, но без сообщения об ошибке).

Я распечатал данные POST в моем views.py до нажатия if form.is_valid() и до добавления format к виджету, он печатает 2020-08-01, тогда как после добавления "format":"MMMM, YYYY" печатает 08-2020. Я предполагаю, что это вызывает проблему.

Как я могу изменить только внешний вид, но оставить исходный в исходном формате, чтобы моя проверка перестала волновать? Думаю, мне нужно было бы использовать JQuery, но все попытки не увенчались успехом:

// this does nothing
$('#birthdayMonth').datepicker({
    format: 'MMMM/YYYY',
});

// I have tried many more things with JQuery but they do nothing or cause my code to go buggy (such as displaying two calendars on top of each other

Еще я подумал о том, чтобы получить birthdayMonth из моих данных POST и добавить поле дня перед его передачей в мой чистый метод. Хотя я уверен, что это сработает, это ужасно взломано и обязательно будет лучший способ.

- РЕДАКТИРОВАТЬ - Если я добавлю

birthdayMonth = forms.DateField(
    input_formats=['MMMM, YYYY'],
    widget=MonthPickerInput(format='MMMM, YYYY')
)

, как предлагает Бен На мой взгляд, December, 2020, поэтому проверка не проходит.

Спасибо.

Ответы [ 3 ]

1 голос
/ 04 августа 2020

https://django-bootstrap-datepicker-plus.readthedocs.io/en/latest/Usage.html?highlight=MonthPickerInput#customize -datepicker-format

«Чтобы использовать произвольные форматы, вы должны указать шаблон для input_formats поля и формат виджета.»

 class BirthdayForm(forms.Form):
     birthdayMonth = forms.DateField(
         input_formats=['MMMM, YYYY'],
         widget=MonthPickerInput(format='MMMM, YYYY')
     )

В противном случае добавление поля «день» чистым методом не повредит:

https://docs.djangoproject.com/en/3.0/ref/forms/validation/#cleaning -a-specifici c -field-attribute

 class BirthdayForm(forms.Form):
    # ...

    def clean_birthdayMonth(self):
        date_ = self.cleaned_data['birthdayMonth']
        date_ = date_.replace(day=1)

        return date_

Если вы можете получить «08-2020» или «Август 2020» из своей формы, вы можете легко преобразовать его в дату и время python с помощью чистого метода

 class BirthdayForm(forms.Form):
    # ...

    def clean_birthdayMonth(self):
        import datetime

        dt_str = '08-2020'
        dt_obj = datetime.datetime.strptime(dt_str, '%m-%Y')
        
        dt_str = "August, 2020"
        dt_obj = datetime.datetime.strptime(dt_str, '%B, %Y')


        dt_str = self.cleaned_data['birthdayMonth']
        dt_obj = datetime.datetime.strptime(dt_str, '%B, %Y')

        return dt_obj

Похоже, что способ выполнить sh - это поймать данные до запуска form.is_valid(). https://docs.djangoproject.com/en/dev/ref/request-response/#querydict -объекты

post = request.POST.copy() # To get a mutable version

dt_str = post['birthdayMonth']  # "August, 2020"
dt_obj = datetime.datetime.strptime(dt_str, '%B, %Y')

post['birthdayMonth'] = dt_obj

# don't forget to update original POST
request.POST = post
1 голос
/ 07 августа 2020

в settings.py установите необходимый формат времени

DATE_INPUT_FORMATS = ['%d/%m/%Y']

а также сделайте

USE_L10N = False

в forms.py настройки импорта

from django.conf import settings

Затем добавьте в class form_name()

birth_date = forms.DateField(widget=forms.DateInput,input_formats= settings.DATE_INPUT_FORMATS)
0 голосов
/ 01 августа 2020

Я бы посоветовал просто оставить свой бэкэнд как есть, а в вашем шаблоне вы можете выполнить необходимое форматирование, например:

{{birthdayMonth|date:"F Y"}}

F даст вам полный месяц, а Y полный год.

Для получения более подробной информации и других форматов вы можете обратиться к документации: https://docs.djangoproject.com/en/3.0/ref/templates/builtins/

...