2011-12-23 15 views
5

में कस्टम JSON क्षेत्र के लिए मैं एक कस्टम Django क्षेत्र का उपयोग कर रहा:उपयोग 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-decoded है और एक शब्दकोश में कनवर्ट किया गया है, इसलिए जब व्यवस्थापक साइट प्रदान की जाती है, तो डेटाबेस से वास्तविक JSON स्ट्रिंग प्रदर्शित नहीं होती है (उदाहरण के लिए {"foo": "बार"}), लेकिन इसका शब्दकोश प्रतिनिधित्व (उदाहरण के लिए {u'foo ': u'bar'})। जब डेटाबेस वस्तु बचत, क्योंकि शब्दकोश की स्ट्रिंग प्रतिनिधित्व एक मान्य JSON स्ट्रिंग नहीं है

जाहिर है इस समस्याओं को जन्म देता।

मेरे पास करने के लिए क्या करना चाहते हैं व्यवस्थापक अजगर वस्तु to_python द्वारा वापस की स्ट्रिंग प्रतिनिधित्व वास्तविक डेटाबेस मूल्य (अर्थात स्ट्रिंग के रूप में यह डेटाबेस में सहेजा जाता है) दिखा साइट के बजाय है।

मेरे प्रयास यह है कि सिर्फ json_encode फिर कॉल शब्दकोश पर के लिए कस्टम विजेट लिखने के लिए हो सकता है - लेकिन वहाँ एक बेहतर तरीका है?

उत्तर

4

value_from_object समस्या को हल करने में मदद करेगा। यह कार्यान्वयन इस बात पर निर्भर करता है कि सीरिएलाइज़र का उपयोग किस प्रकार किया गया है, लेकिन सरलजॉन के लिए ऐसा दिखना चाहिए:

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

संबंधित मुद्दे