pythondjangodjango-modelsdjango-admindjango-jsonfield

Django Admin: JSONField default empty dict wont save in admin


in my model defn i have

from django.contrib.postgres.fields import JSONField
.....
.......
.........

media_data=JSONField(default=dict)

I created a default admin

When i attempt to save without touching the field, i get a this field is required error.

field is required

It looks like a form validation issue because I can programatically save the model instance from code without issue.

Why is this happening?
have i missed something silly?


Solution

    1. What happening. when dive into the source code. we can see the following call stack:
        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)
    

    when look into the source code ,you can find that,it's mainly because the empty_values check.

    # These values, if given to validate(), will trigger the self.required check.
    EMPTY_VALUES = (None, '', [], (), {})
    

    as you can see the empty dict {} is as an empty value for JSONField. so it will raise Error.

    1. What can we do? the Solution would be to customize the models.JSONField and forms.JSONField like below.

    forms.py

    from django.contrib.postgres import forms
    
    class MyJSONField(forms.JSONField):
        empty_values = [None, "", [], ()]
    

    db/fields.py

    class MyJSONField(JSONField):
        def formfield(self, **kwargs):
            from ..forms import MyJSONField
    
            return super().formfield(**{"form_class": MyJSONField, **kwargs})