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

标签 python json django validation datetime

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

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

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() 已经失败,导致模型未保存。

我尝试使用 clean_pumpStart(self): 作为 Django Forms但是当 bokningForm.is_valid() 失败时没有调用该函数,导致与上述相同的问题。

感谢任何帮助!

最佳答案

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

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

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

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

关于python - 更改 Django 表单中的字段,覆盖 clean(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51326314/

相关文章:

javascript - Django模板: get dictionary's value based on the key that equals to certain tag's value

python - 如何在 Python 中将 X509Name 对象转换为字符串

python - Python 中的亲和矩阵聚类

python - 如何添加或删除 Chrome 扩展 "after"selenium 网络驱动程序已实例化/定义

json - 如何在 Firefox Quantum Developer Edition 中自动展开 json View ?

javascript - ajax 请求后访问 JSON 中的元素

iphone - 在 iOS 5 项目中放置 JSON 解析代码的合适位置在哪里?

javascript - 使用 Ajax 改变点击按钮的状态

django - 如何混合使用 Django、Uploadify 和 S3Boto 存储后端?

python - 如何使用keras-rl进行多智能体训练