2014-01-22 29 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'))