更改DatePicker的格式会导致验证错误

布伦登

我正在使用一个日期时间选择器,用户在其中选择一个月(MonthPickerInput)。

models.py

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

表格

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也可以)。要做到这一点,我添加一个字段formatfroms.py

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

这在前端正确显示,但是表单验证始终失败(每当我提交表单时,日历输入将突出显示为红色,但没有错误消息)。

在命中if form.is_valid()和添加format到打印的小部件之前,我在views.py中打印了POST数据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

我想做的另一件事是从POST数据中获取BirthdayMonth并添加day字段,然后再将其传递给我的clean方法。虽然我敢肯定这是行得通的,但它确实非常骇人,而且肯定会有更好的方法。

-编辑-如果我添加

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

正如Ben所建议的那样,它传递December, 2020了我的观点,这就是验证失败的原因。

谢谢。

Ben

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

否则,以干净的方法添加“ day”字段不会有任何危害:

https://docs.djangoproject.com/zh-CN/3.0/ref/forms/validation/#cleaning-a-specific-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年8月”,则可以使用clean方法轻松地将其转换为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

听起来确实要完成的方法是在form.is_valid()运行之前捕获数据https://docs.djangoproject.com/zh-CN/dev/ref/request-response/#querydict-objects

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

撰写扩展文件会导致验证错误

更改BIOS密码会导致错误(BIOS错误)

尝试以文本格式获取语音会导致错误

在nanoPI上运行docker容器会导致“ exec格式错误”

两次构建Blogdown网站会导致格式错误

面板内的必填字段会导致验证错误

什么会导致隐窝产生错误的验证?

更新商品会导致业务验证错误-问我

为什么此XSD验证会导致错误

在 topmodule 中制作子模块会导致验证器错误

使用 react hook 表单验证会导致错误

流利的验证验证器会导致错误,甚至没有添加验证代码

生成CRUD代码后更改表会导致yii错误

使用JSTL会导致更改时产生deferredExpression错误

更改此Ruby类的名称会导致错误

Python从单个输入更改为列表会导致错误

是什么会导致偶发的“ -2147352567数据已更改”错误?

Bootstrap DatePicker更改格式

异步验证器导致“表达式已更改”错误

更改Java时间戳格式会导致更改时间戳

格式/样式问题-在Int后面加上文字会导致格式错误

在applicationHost.config上执行Powershell替换会导致格式错误的xml错误

Laravel登录到Slack工作簿会导致“卷曲错误(代码3):<url>格式错误”

DomDocument验证错误格式

生成的进程的打印输出会导致格式错误的输出:为什么?

使用Python编辑Parquet文件会导致日期时间格式错误

使用GPXPY解析gpx文件会导致格式不正确的无效令牌错误

将64位NASM与MinGW-64链接会导致“无法识别文件格式”错误

Caffe Python | 输入数据格式错误可能会导致GoogleNet准确性低下?