问题
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.
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?
回答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.
- 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})
回答2:
Depending on your requirements, consider to use blank and/or null.
media_data=JSONField(blank=True, null=True)
回答3:
This caused problems for me recently, though with django-mysql
rather than postgres and in a custom ModelForm
rather than the admin interface.
I ended up overriding my model's save()
method:
from django_mysql.models import JSONField
class yourModel(model):
media_data=JSONField(default=dict, blank=True)
def clean(self, *args, **kwargs):
if self.media_data is None:
self.media_data = "{}"
def save(self, *args, **kwargs):
self.clean()
super().save(*args, **kwargs)
回答4:
i have similar problem previously. adding required=False
in your form field will solve the problem.
class YourForm(forms.ModelForm):
media_data = SimpleArrayField(JSONField(), required=False, widget=forms.Textarea, delimiter='|')
来源:https://stackoverflow.com/questions/55147169/django-admin-jsonfield-default-empty-dict-wont-save-in-admin