2014-01-22 58 views
3

我正在使用django 1.4,並收到request.POST.dict()中的參數,其中包含Unicode格式的所有值。如如何從request.POST字典中獲取布爾值

{u'sam_status': u'true', u'address_type': u'false', u'is_deleted': u'false', u'title': u'true'} 

但是這些值應該是布爾值,因爲它們是從HTML頁面的單選按鈕呈現的。

我想這個request.POST.dict()轉換成一個簡單的Python字典,這將有Python的值,如'true'/'false' ==> True/False.

注:我不想申請循環,因爲這可能會影響性能,因爲這適用於龐大的數據。

+0

那是你的request.POST字典的實際打印?如果單選按鈕沒有被選中,通常它的關鍵就不會在POST中回來。 – ptr

+0

@PeteTinkler我認爲這是複選框,這是未經檢查的複選框輸入不發送任何東西,但對於單選按鈕它是一個不同的東西。 – tayfun

+0

在html表單中有單選按鈕,並且來自Jquery,我正在使用序列化表單來觸發ajax調用。 – CrazyGeek

回答

1

django如何知道這些問題是單選按鈕輸入?這對於Django來說都是一樣的,因爲其他表單輸入的答案都是以文本格式發送的。

將這些值轉換爲正確的數據類型的正確方法是通過Django表單。您可以創建一個表格來獲得您想要的答案,並在「乾淨」的時候使用正確的格式。退房Django's own forms documentation

你應該是這樣的:即Django的形式在後臺會做你所說

form = MyForm(request.POST) 
    if form.is_valid(): 
     status = form.cleaned_data['sam_status'] 

注意,它基本上會經歷數據,並根據形式定義正常化他們。但即使形式非常大,也不應該造成很大的性能問題。如果速度非常慢,我建議您查看其他代碼以瞭解性能瓶頸。

+0

你是對的,但我不寫django表單,我設計了django API並從第三方web應用程序獲取此請求。所以我不能用上面你解釋的。我在request.POST中獲取參數,並且只想將其所有值替換爲pythonic值。 – CrazyGeek

+0

但是你不能'輸入django.forms'嗎?既然你有'request.POST',我假設你有權訪問django。否則,你將不得不自己完成所有規範化/表單處理,併爲Django免費提供的驗證和處理進行編碼。 – tayfun

+0

不,因爲我設計了REST API,我們正在處理Django模型,但是我從您的答案中得到了一條提示,我將嘗試在運行時創建模型表單實例,並且我會觸發is_valid方法。我希望這會幫助我。你說什麼?? – CrazyGeek

1

閱讀完評論後,您的工作方式(不使用Django表單,接受來自第三方Web應用程序的POST請求並選擇將輸入序列化爲u"true"u"false"),您別無選擇,只能循環播放POST字典鍵並在python中手動將字符串轉換爲bools。如果這真的對性能產生影響,那麼現在可能是重新考慮你的方法的時候了。

出於好奇,誰在設計你正在接受的表單和序列化?你甚至在做連續劇還是他們?你在安全方面做了什麼? 「通用REST API模型表單提交」和「第三方網絡應用程序」聽起來像是一場災難。

編輯:請不要使用eval()u"False"轉化爲False

>>> for key, value in request.POST.items(): 
...  if value == u'true': 
...   a[key] = True 
...  if value == u'false': 
...   a[key] = False 
+0

好的,那麼你建議申請什麼方法循環和如何? – CrazyGeek

+0

取決於您如何序列化表單,但對於您的OP示例,請參閱編輯 – ptr

0

你爲什麼不編碼數據以JSON當您發佈呢?就像這樣:

$.ajax({ 
    url:url, 
    type:"POST", 
    data:data, 
    contentType:"application/json; charset=utf-8", 
    dataType:"json", 
    success: function(){ 
    ... 
    } 
}); 

然後,如果你在Django解碼響應主體,一切都會好起來:

requestPost = json.loads(request.body.decode('utf-8'))