- Author:
- abbasovalex
- Posted:
- July 16, 2013
- Language:
- Python
- Version:
- 1.3
- Score:
- 1 (after 1 ratings)
You can see full examples on the page GitHub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | # -*- coding: utf-8 -*-
from django import forms
from django.forms import Widget
from django import utils
import copy
try:
import simplejson as json
except ImportError:
import json
class SplitJSONWidget(forms.Widget):
def __init__(self, attrs=None, newline='<br/>\n', sep='__', debug=False):
self.newline = newline
self.separator = sep
self.debug = debug
Widget.__init__(self, attrs)
def _as_text_field(self, name, key, value, is_sub=False):
attrs = self.build_attrs(self.attrs, type='text',
name="%s%s%s" % (name, self.separator, key))
attrs['value'] = utils.encoding.force_unicode(value)
attrs['id'] = attrs.get('name', None)
return u""" <label for="%s">%s:</label>
<input%s />""" % (attrs['id'], key, forms.util.flatatt(attrs))
def _to_build(self, name, json_obj):
inputs = []
if isinstance(json_obj, list):
title = name.rpartition(self.separator)[2]
_l = ['%s:%s' % (title, self.newline)]
for key, value in enumerate(json_obj):
_l.append(self._to_build("%s%s%s" % (name,
self.separator, key), value))
inputs.extend([_l])
elif isinstance(json_obj, dict):
title = name.rpartition(self.separator)[2]
_l = ['%s:%s' % (title, self.newline)]
for key, value in json_obj.items():
_l.append(self._to_build("%s%s%s" % (name,
self.separator, key),
value))
inputs.extend([_l])
elif isinstance(json_obj, (basestring, int)):
name, _, key = name.rpartition(self.separator)
inputs.append(self._as_text_field(name, key, json_obj))
elif json_obj is None:
name, _, key = name.rpartition(self.separator)
inputs.append(self._as_text_field(name, key, ''))
return inputs
def _prepare_as_ul(self, l):
if l:
result = ''
for el in l:
if isinstance(el, list) and len(l) is 1:
result += '%s' % self._prepare_as_ul(el)
elif isinstance(el, list):
result += '<ul>'
result += '%s' % self._prepare_as_ul(el)
result += '</ul>'
else:
result += '<li>%s</li>' % el
return result
return ''
def _to_pack_up(self, root_node, raw_data):
copy_raw_data = copy.deepcopy(raw_data)
result = []
def _to_parse_key(k, v):
if k.find(self.separator) is not -1:
apx, _, nk = k.rpartition(self.separator)
try:
# parse list
int(nk)
l = []
obj = {}
index = None
if apx != root_node:
for key, val in copy_raw_data.items():
head, _, t = key.rpartition(self.separator)
_, _, index = head.rpartition(self.separator)
if key is k:
del copy_raw_data[key]
elif key.startswith(apx):
try:
int(t)
l.append(val)
except ValueError:
if index in obj:
obj[index].update({t: val})
else:
obj[index] = {t: val}
del copy_raw_data[key]
if obj:
for i in obj:
l.append(obj[i])
l.append(v)
return _to_parse_key(apx, l)
except ValueError:
# parse dict
d = {}
if apx != root_node:
for key, val in copy_raw_data.items():
_, _, t = key.rpartition(self.separator)
try:
int(t)
continue
except ValueError:
pass
if key is k:
del copy_raw_data[key]
elif key.startswith(apx):
d.update({t: val})
del copy_raw_data[key]
v = {nk: v}
if d:
v.update(d)
return _to_parse_key(apx, v)
else:
return v
for k, v in raw_data.iteritems():
if k in copy_raw_data:
# to transform value from list to string
v = v[0] if isinstance(v, list) and len(v) is 1 else v
if k.find(self.separator) is not -1:
d = _to_parse_key(k, v)
# set type result
if not len(result):
result = type(d)()
try:
result.extend(d)
except:
result.update(d)
return result
def value_from_datadict(self, data, files, name):
data_copy = copy.deepcopy(data)
result = self._to_pack_up(name, data_copy)
return json.dumps(result)
def render(self, name, value, attrs=None):
try:
value = json.loads(value)
except TypeError:
pass
inputs = self._to_build(name, value or {})
result = self._prepare_as_ul(inputs)
if self.debug:
# render json as well
source_data = u'<hr/>Source data: <br/>%s<hr/>' % str(value)
result = '%s%s' % (result, source_data)
print result
return utils.safestring.mark_safe(result)
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 8 months, 4 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 9 months ago
- Serializer factory with Django Rest Framework by julio 1 year, 3 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 4 months ago
- Help text hyperlinks by sa2812 1 year, 5 months ago
Comments
Hi everybody. I am new in django. I am searching solution to display jsonfield in django admin. I think this snippet can resolve my problem, but i don't know how to use this. Please guide me. Many thanks.
#
Please login first before commenting.