【问题标题】:Use forms.TextArea for custom JSON field in Django admin site在 Django 管理站点中使用 forms.TextArea 自定义 JSON 字段
【发布时间】:2023-03-29 22:33:02
【问题描述】:

我正在使用自定义 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 字符串。

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

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

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    value_from_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))
    

    【讨论】:

    • 这有帮助。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 2015-02-16
    • 1970-01-01
    • 2018-12-16
    • 2010-10-25
    • 1970-01-01
    • 2011-11-28
    • 2020-03-04
    相关资源
    最近更新 更多