2011-12-23 117 views
5

定製JSON場我使用的是定製的Django字段表示JSON編碼的數據:使用forms.TextArea在Django管理站點

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 - 但有沒有更好的方法?

回答

4

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)) 
+0

這有助於。非常感謝你! – ChrisM 2011-12-23 14:36:26