在Django管理站点中为自定义JSON字段使用forms.TextArea

在Django管理站点中为自定义JSON字段使用forms.TextArea,django,django-admin,Django,Django Admin,我使用自定义Django字段来表示JSON编码的数据: class JSONField(models.TextField): __metaclass__ = models.SubfieldBase def to_python(self, value): if value == "": return None try: if isinstance(value, basestring):

我使用自定义Django字段来表示JSON编码的数据:

class JSONField(models.TextField):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if value == "":
            return None

        try:
            if isinstance(value, basestring):
                return json_decode(value)
        except ValueError:
            pass

        return value

    def get_prep_value(self, value):
        if value == "":
            return None
        if isinstance(value, dict) or isinstance(value, dict):
            value = json_encode(value)
            return super(JSONField, self).get_prep_value(value)

    def value_to_string(self, obj):
        value = self._get_val_from_obj(obj)
        return self.get_db_prep_value(value,connection=None)
这个领域本身运作良好。但是,无法通过管理站点进行编辑,因为数据库中的字符串经过JSON解码并转换为字典,因此在呈现管理站点时,显示的不是数据库中的实际JSON字符串(例如{foo:“bar”}),而是其字典表示形式(例如{u'foo':u'bar'})

显然,这会导致保存数据库对象时出现问题,因为字典的字符串表示形式不是有效的JSON字符串

我想要的是显示实际数据库值(即保存在数据库中的字符串)的管理站点,而不是返回给Python的Python对象的字符串表示形式


我的尝试是为此编写一个自定义小部件,只需在字典上再次调用json编码——但有没有更好的方法?

value\u from\u object
将有助于解决这个问题。它的实现取决于所使用的序列化程序,但对于simplejson,它应该如下所示:

from django.utils import simplejson as json
from django.core.serializers.json import DjangoJSONEncoder

class JSONField(models.TextField):
....

    def value_from_object(self, obj):
        return json.dumps(super(JSONField, self).value_from_object(obj))

这有帮助。非常感谢你!