如何从request.POST字典中获取布尔值

8

我正在使用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 字典,其中包含类似 Python 的值,例如对于 'true'/'false' ==> True/False。

注意:我不想使用 for 循环,因为这可能会影响性能,因为它适用于大量数据。


这是您的request.POST字典的实际打印吗?如果单选按钮未被选中,通常它的键根本不会在POST中返回。 - ptr
@PeteTinkler 我认为这是针对复选框的,因为未选中的复选框输入不会发送任何内容,但对于单选按钮来说情况就不同了。 - tayfun
在HTML表单中有单选按钮,我使用Jquery序列化表单并触发一个Ajax调用。 - CrazyGeek
一个通过字典的for循环如何比首次通过HTTP发送该字典对性能产生更大的影响? - Daniel Roseman
因为我设计了通用的REST API,可以处理超过50个HTML表单。 - CrazyGeek
4个回答

7
阅读评论后,我发现你的做法(不使用 Django 表单,接受来自第三方 Web 应用程序的 POST 请求,并选择将输入序列化为 u"true"u"false")只能通过循环遍历 POST 字典键并在 Python 中手动将字符串转换为布尔值。如果这真的会对性能产生如此大的影响,那么可能是重新考虑你的方法的时候了。
出于好奇,谁设计了你正在接受和序列化的表单?你是否在执行序列化,还是他们在执行?而在安全方面,你做了什么?“通用 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

好的,那么你建议采用什么方法来应用循环以及如何实现? - CrazyGeek
取决于您如何序列化表单,但对于您的 OP 示例,请参见编辑。 - ptr
这个可以工作,但如果我有一个字典内嵌在另一个字典里怎么办?我需要为POST中所有可能的字典循环吗? - GIA

3

如何让Django知道这些问题是单选按钮输入?对于Django来说,这都是一样的,因为其他表单输入答案都以文本格式发送。

将这些值转换为正确的数据类型的正确方法是通过Django表单。您可以为所需的答案创建一个表单,并在“clean”后,它将以正确的格式呈现。请查看Django自己的表单文档

您应该拥有类似以下内容:

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

请注意,Django表单在后台会执行您所说的操作,基本上会根据表单定义遍历数据并将其归一化。但是即使表单非常大,也不应该引起太多性能问题。如果它运行得非常慢,建议您检查其他可能存在性能瓶颈的代码。

你说得没错,但我并没有编写 Django 表单,我设计了 Django API,并从第三方 Web 应用程序中获取此请求。因此,我无法使用你上面解释的方法。我正在请求中获取参数,并希望将其所有值替换为 Pythonic 值。 - CrazyGeek
不,因为我设计了一个处理Django模型的REST API。但是从你的回答中我得到了一个提示,我将尝试在运行时创建模型表单实例,然后再调用is_valid方法。我希望这会对我有所帮助。你觉得呢? - CrazyGeek
我曾考虑使用django.forms.models.modelform_factory来创建通用的模型表单实例,但不幸的是,这个功能只适用于Django 1.5及以上版本,而我正在使用1.4版本 :( - CrazyGeek
我也在查看同样的文档,但是 "django.forms.models.modelform_factory" 不在1.4版本中。 - CrazyGeek
我刚刚尝试在我的项目shell中导入"from django.forms.models import modelform_factory",我的Django版本是1.4.5,它可以正常工作。 - CrazyGeek
显示剩余3条评论

1
bool_dict = {'true': True, 'false': False, 'True': True, 'False': False}
bool_value = bool_dict.get(request.POST.get('bool_value', 'false'), False)


2
回答需要支持信息 您的回答可以通过提供更多的支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认您的回答是否正确。您可以在帮助中心找到关于如何撰写良好回答的更多信息。 - moken

-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'))

不起作用。Django 2.1。json.decoder.JSONDecodeError:期望值:第1行第1列(字符0) - GIA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接