更改Django表单中的字段,重写clean()

2024-03-29 10:53:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个日期,传递为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()方法

^{pr2}$

这成功地将它转换为datetime对象,我使用print(cleaned_data)进行了检查

我的问题是数据返回得很晚,因为(我认为)bokningForm.is_valid()已经失败,导致模型没有被保存。在

我尝试使用clean_pumpStart(self):,就像在Django Forms中一样,但是当{}失败时,函数没有被调用,导致了与上面一样的问题。在

感谢任何帮助!在


Tags: cleanjson表单目标isrequestbody空格
2条回答

Clean data在is_有效之前运行,因为Clean是django运行以验证表单的许多方法之一

因为您只清洁一个区域,请使用“清洁”来清洁此区域

class BokningForm(ModelForm)
    ...

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

在你看来,也许这可以锻炼身体

^{pr2}$

编辑:在其他帖子中得到了一些有用的信息。。。尝试在模型内部使用clean方法,看起来这是先运行的

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

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

你不需要做这些。相反,您应该重新定义字段本身,提供^{}属性:

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

现在Django将自动转换该值,作为自己验证过程的一部分。在

注意,如果您所做的是验证JSON,那么您可能希望使用Django REST框架及其序列化程序,而不是普通的Django表单。在

相关问题 更多 >