我有一个日期,以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()
失败时未调用该函数,从而导致与上述相同的问题。
任何帮助表示赞赏!
答案 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):
...