2011-12-23 6 views
5

sto usando un campo di Django personalizzato per rappresentare JSON dati codificati:Usa forms.TextArea per la personalizzazione campo JSON in Django amministratore del sito

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) 

Il campo stesso funziona bene. Tuttavia la modifica tramite il sito admin non è possibile poiché la stringa dal database è decodificata JSON e convertita in un dizionario, quindi quando viene eseguito il rendering del sito di amministrazione, non viene visualizzata la stringa JSON effettiva dal database (ad esempio {"foo": "bar"}), ma la sua rappresentazione del dizionario (ad esempio {u'foo ': u'bar'}).

Ovviamente questo porta a problemi durante il salvataggio dell'oggetto di database, poiché la rappresentazione di stringa del dizionario non è una stringa JSON valida.

Quello che mi piacerebbe avere è il sito di amministrazione che mostra il valore reale del database (cioè la stringa così come viene salvata nel database), invece della rappresentazione di stringa dell'oggetto Python restituito da to_python.

Il mio tentativo sarebbe quello di scrivere un widget personalizzato per questo che richiama nuovamente json_encode sul dizionario - ma c'è un modo migliore?

risposta

4

value_from_object aiuterà a risolvere il problema. La sua implementazione dipende da quale serializzatore è stato usato, ma per simplejson dovrebbe assomigliare a:

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

Questo ha aiutato. Grazie mille! – ChrisM

Problemi correlati