2

我正在尝试以 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"]}
4

1 回答 1

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 值可能不是一个好主意。

于 2013-06-18T17:03:36.203 回答