Python >> Tutoriel Python >  >> Python Tag >> JSON

Django Admin :le dict vide par défaut de JSONField ne sera pas enregistré dans l'administrateur

  1. Que se passe-t-il ? Lorsque vous plongez dans le code source. nous pouvons voir la pile d'appels suivante :
    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)

lorsque vous regardez dans le code source, vous pouvez trouver que c'est principalement parce que le empty_values vérifier.

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

comme vous pouvez le voir le dict vide {} est une valeur vide pour JSONField. il va donc générer une erreur.

  1. Que pouvons-nous faire ? La solution serait de personnaliser les modèles.JSONField et forms.JSONField comme ci-dessous.

formulaires.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})