更改Django表单中的字段,覆盖clean()

时间:2018-07-13 13:30:51

标签: python json django validation datetime

我有一个日期,以2019-01-01T00:02的形式传递。我的目标是用空白2019-01-01 00:02替换T。

使用表格,我验证该字段和其他字段。

klientForm = KlientForm(json.loads(request.body.decode()))
bokningForm = BokningForm(json.loads(request.body.decode()))
if klientForm.is_valid() and bokningForm.is_valid():
    #Save model, etc.

我正在使用DateTimeField,除非我像上面那样更改日期,否则它将不接受日期。我实现了自己的clean()方法,

def clean(self):
    cleaned_data = super(BokningForm, self).clean()
    pumpStart = self.data['pumpStart']
    pumpStart = pumpStart.replace("T", " ")
    cleaned_data['pumpStart'] = datetime.strptime(pumpStart, "%Y-%m-%d %H:%M")
    return cleaned_data

这已成功将其转换为日期时间对象,我使用print(cleaned_data)

检查过

我的问题是,由于(我认为)bokningForm.is_valid()已经失败,导致数据被退回,导致模型无法保存。

我尝试像在Django Forms中一样使用clean_pumpStart(self):,但是在bokningForm.is_valid()失败时未调用该函数,从而导致与上述相同的问题。

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

您无需执行任何操作。相反,您应该重新定义字段本身,提供input_formats属性:

class BokningForm(forms.ModelForm):
    pumpStart = forms.DateTimeField(input_formats=['%Y-%m-%dT%H:%M:%S'])
    ...

现在Django将在其自身的验证过程中自动转换该值。

请注意,如果您正在执行的工作是验证JSON,则可能要使用Django REST框架及其序列化程序,而不是普通的Django形式。

答案 1 :(得分:0)

清除数据在is_valid之前运行,因为清除是django用来验证表单的多种方法之一

由于您只清洁一个字段,因此请对该字段使用清洁

class BokningForm(ModelForm)
    ...

    def clean_pumpstart(self):
        data = self.cleaned_data['pumpStart']
        data = datetime.strptime(data , "%Y-%m-%d %H:%M")
        return data

在您看来,这可以锻炼身体

if form.is_valid():
    bokning= form.save(commit=False)
    ... # Change your value
    bokning.save()

编辑:在其他文章中获得了一些不错的信息...尝试在模型内部使用清洁方法,看起来像是先运行

class Bokning(models.Model):
    def clean(self):
        ...

来源:Django: Model clean method called before form clean