在Django管理站点中为自定义JSON字段使用forms.TextArea
我使用自定义Django字段来表示JSON编码的数据:在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):
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))
这有帮助。非常感谢你!