Используйте forms.TextArea для настраиваемого поля JSON на сайте администратора Django

Я использую настраиваемое поле 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, возвращаемого to_python.

Моей попыткой было бы написать для этого специальный виджет, который просто снова вызывает json_encode в словаре - но есть ли способ лучше?

6
задан ChrisM 23 December 2011 в 02:37
поделиться