【问题标题】:Changing field in Django Form, overriding clean()更改 Django 表单中的字段,覆盖 clean()
【发布时间】:2018-07-13 13:30:51
【问题描述】:

我有一个日期,以2019-01-01T00:02 传递。我的目标是将 T 替换为空格 2019-01-01 00:02

使用表单,我验证该字段和其他一些字段。'

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()失败时没有调用该函数,导致与上述相同的问题。

任何帮助表示赞赏!

【问题讨论】:

    标签: python json django validation datetime


    【解决方案1】:

    清理数据在 is_valid 之前运行,因为清理是 django 运行以验证表单的众多方法之一

    因为你只清理了一个字段,所以对这个字段使用 clean

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

    编辑:在其他帖子中获得了一些很好的信息...尝试在模型中使用 clean 方法,看起来这个首先运行

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

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

    【讨论】:

    • 表单域会在表单的clean_pumpstart方法被调用之前被清理掉,所以去那里改已经来不及了。
    • 它很奇怪......干净的函数应该在验证之前被调用,所以你可以在传递给模型验证之前设置你的数据和周围的东西
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2020-09-16
      • 1970-01-01
      • 2014-05-09
      • 2010-10-13
      • 2012-02-06
      相关资源
      最近更新 更多