我尝试在HTML表单中显示JSON文档,分成单独的输入项,允许修改,然后将其转换回JSON文档。
首先,我使用data = json.load(json_data)
将文档转换为对象,然后将data
传递给模板,在模板中访问其属性,如下所示:<input type="hidden" name="countries" value="{{ data.countries }}">
。
回到视图后,我使用doc = json.dumps(request.POST)
将其序列化回JSON。这适用于所有条形数组:"countries": "[u'US']"
,它应该类似于:"countries": ['US']
我可以使用字符串操作来清理它,但是有更好的方法吗?
view.py(剥离了数据库代码)
def addProducts(request):
if request.POST:
doc = json.dumps(request.POST)
return HttpResponseRedirect('/add_product')
json_data = open('items.json')
data = json.load(json_data)
return render("add_products.html", {
"products": data,
}, context_instance=RequestContext(request))
doc
最终成为一个字符串:
{"doc_type": "Product", "countries": "[u'US']"}
items.json
中的原始数据:
{"doc_type": "Product", "countries": ["US"]}
答案 0 :(得分:5)
奥莱特。罪魁祸首是这一行:
<input type="hidden" name="countries" value="{{ data.countries }}">
在某种程度上,您实际上正在将str(data.countries)
传递给您的模板(隐式),这会产生这些时髦的错误。您必须先将其序列化,然后在视图中再次解析它:
def addProducts(request):
if request.POST:
post = {}
for key in request.POST:
value = request.POST[key]
try:
value = json.loads(value)
except Exception:
pass
post[key] = value
doc = json.dumps(post)
# the other code goes here
return render("add_products.html", {
"products": data,
}, context_instance=RequestContext(request))
现在这看起来有点矫枉过正,但必须要做,因为request.POST
是JSON字符串的字典(你必须手动转换为dict / JSON)。
结论:首先在表单中使用JSON值可能不是一个好主意。