【问题标题】:How to get Django ModelForm to accept a date in a particular format (or convert to an acceptable fomat)?如何让 Django ModelForm 接受特定格式的日期(或转换为可接受的格式)?
【发布时间】:2020-10-08 05:11:53
【问题描述】:

我有一个带有日期字段的模型。我正在使用这个模型来创建一个使用 ModelForm 类的表单。

问题是用户可以输入多种格式的日期(d-m-yy、dd-mm-yy、dd-mm-yyyy)(暂时不考虑区域设置)。 表格提交后。由于日期格式,Django form.is_valid() 失败。

我需要处理不同的格式,但不知道该怎么做。这是一个最小的 Form 和 Model 类:(假设导入正确)

class MyForm(forms.ModelForm):
    class Meta:
        model = models.MyDateModel
        fields = ["date"]

        widgets = {

            "date":   forms.DateInput(),
        }

模型类

class MyDateModel(models.Model): 
    date = models.DateField()

【问题讨论】:

    标签: django forms date model format


    【解决方案1】:

    最简单的方法是here

    或者您可以将clean_date 函数添加到您的表单类,使用正则表达式检查日期输入并将其转换为 Django 日期时间格式。像这样的:

    import datetime, re
    
    
    class MyForm(forms.ModelForm):
        ...
    
        def clean_date(date):
            date = self.cleaned_data.get('date')
            if re.match('^\d{1,2}-\d{1,2}-\d{2}', date) is not None:
                return datetime.datetime.strptime(date, "%d-%m-%y").strftime("%Y-%m-%d")
            if re.match('^\d{2}-\d{2}-\d{4}', date) is not None:
                return datetime.datetime.strptime(date, "%d-%m-%Y").strftime("%Y-%m-%d")
    
    

    【讨论】:

    • 最终使用了您提供的链接中的 DateField 。使用一些 javascript 来确保只提交选定的格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2015-03-31
    • 2021-03-31
    • 2014-09-23
    相关资源
    最近更新 更多