我正在使用django 1.4并且我在request.POST.dict()
中收到了包含Unicode格式的所有值的参数。如
{u'sam_status': u'true', u'address_type': u'false', u'is_deleted': u'false', u'title': u'true'}
但是这些值在从HTML页面的单选按钮呈现时应该是布尔值。
我想将此request.POST.dict()
转换为一个简单的python dict,它将具有pythonic值,例如'true'/'false' ==> True/False.
注意:我不想申请循环,因为这可能会影响性能,因为这适用于大量数据。
答案 0 :(得分:4)
阅读了评论,你正在做的方式(不使用Django表单,接受来自第三方网络应用程序的POST请求,并选择将输入序列化为u"true"
和u"false"
)没有选择,只能循环遍历POST
字典键,并在python中手动将字符串转换为bool。如果这确实对性能产生了很大影响,那么可能需要重新考虑您的方法。
出于好奇,谁在设计你接受和序列化的表格?你甚至在做序列化还是他们?你在安全方面做了什么? “通用REST API模型表单提交”和“第三方Web应用程序”听起来像是灾难的秘诀。
修改:请勿使用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
答案 1 :(得分:1)
django如何知道这些问题是单选按钮输入? Django也是如此,因为其他表单输入答案都是以文本格式发送的。
将这些值转换为正确的数据类型的正确方法是通过Django表单。您可以为自己想要的答案创建一个表单,当它“干净”时,它将采用正确的格式。查看Django's own forms documentation。
你应该有类似的东西:
form = MyForm(request.POST)
if form.is_valid():
status = form.cleaned_data['sam_status']
请注意,后台的django表单会按照你所说的做,它将基本上通过数据并根据表单定义对它们进行规范化。但即使表单非常大,也不应该造成很大的性能问题。如果它非常慢,我建议你检查一下你遇到的性能瓶颈代码。
答案 2 :(得分:-1)
为什么不在发布时用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'))