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?
Questo ha aiutato. Grazie mille! – ChrisM