2013-06-18 27 views
2

我想在HTML表單中顯示一個JSON文檔,分解成單獨的輸入項,允許修改,然後將其轉換回JSON文檔。Django:json.dumps打破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(剝出DB代碼)

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最終被一字符串:在items.json

{"doc_type": "Product", "countries": "[u'US']"} 

原始數據:

{"doc_type": "Product", "countries": ["US"]} 
+0

如何提交POST? –

+0

在模板中?通過一個形式'' – KingFu

+0

這看起來像是不應該發生的事情,因爲QueryDict以與正常字典相同的方式被序列化。從這個字符串('u'前綴)的形式來看,它看起來像沿着像'str(arr)'而不是'arr''設置'request.POST [「countries」]'這樣的行來做一些奇怪的事情。 。請發佈完整的代碼。 – freakish

回答

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字符串的字典(你必須手動轉換爲字典/ JSON)。

結論:具有表單中的JSON值可能不是一個好主意。

+0

無法獲得value =「{{json.dumps(data.countries) }}'工作,所以在視圖方面,而不是在數據方面:d ['countries'] = json.dumps(d ['countries'])'這與您的視圖代碼結合產生''國家「:」[\「US \」]「',我不確定是正確的JSON?代碼更改也會導致文檔重複多次,我需要查看一下 – KingFu

+0

@KingFu我剛剛意識到:在「return render」語句中沒有「data」。它如何傳遞給模板? – freakish

+0

@KingFu至於JSON:這是一個有效的JSON,但是在我的代碼中有一個錯誤。它應該是'value = request.POST [key]'(循環中的第一行)。是的,你的解決方案是它應該如何。我忘了你不能在Django模板中激發函數(與Mako一起工作時間過長)。 – freakish