- 发生了什么。深入研究源代码时。我们可以看到以下调用堆栈:
1) form.is_valid()
->form.full_clean()
-->form._clean_fields()
---> self.cleand_data[name] = field.clean(value)
2) field.clean(value)
-> self.to_python(value)
-> self.validate(value)
查看源代码,你可以发现,主要是因为empty_values
检查。
# These values, if given to validate(), will trigger the self.required check.
EMPTY_VALUES = (None, '', [], (), {})
如您所见,空字典{}
作为 JSONField 的空值。所以它会引发错误。
- 我们能做些什么?解决方案是自定义 models.JSONField 和 forms.JSONField 如下所示。
表格.py
from django.contrib.postgres import forms
class MyJSONField(forms.JSONField):
empty_values = [None, "", [], ()]
数据库/字段.py
class MyJSONField(JSONField):
def formfield(self, **kwargs):
from ..forms import MyJSONField
return super().formfield(**{"form_class": MyJSONField, **kwargs})