【问题标题】:what's the value type of the value of request.POST in django?django中request.POST的值的值类型是什么?
【发布时间】:2022-01-25 09:04:08
【问题描述】:

这是来自 print(request.POST)

<QueryDict: {'csrfmiddlewaretoken': ['2Tg4HgJ07qksb3hPUDWSQYueYOjYOkQcmzll9fnjbJ0GZHkWHdM8DtYqZB4uv3Fv'], 'username': ['boycececil'], 'password': ['password']}>

这是来自 print(request.POST.get('username'))

boycececil

如您所见,列表(来自 QueryDict 的值之一)-> 字符串(来自 get 函数),这很神奇!不是吗?

那么,有人知道发生了什么吗?

【问题讨论】:

  • docs.djangoproject.com/en/4.0/ref/request-response/… a dictionary-like class customized to deal with multiple values for the same key docs.djangoproject.com/en/4.0/ref/request-response/… Returns the value for the given key. If the key has more than one value, it returns the last value
  • 仅供参考,在 python 中,您可以使用 type() 来查看对象的类型,它是谁的子类。在这种情况下,打印 type(request.POST) 并打印“django.http.request.QueryDict”,您可以查看 django 文档以查看“QueryDict”是什么以及此类是否存在多态性。

标签: django


【解决方案1】:

django中request.POST的值是什么值类型?

类型是django.http.request.QueryDict

如您所见,list -&gt; string,这太神奇了!不是吗?

不,这不是魔法。这只是QueryDictdocumented behavior

"QueryDict.__getitem__(key)

返回给定键的值。如果键有多个值,则返回最后一个值。 ...”

注意:如果您想要一个键的所有值,您可以在QueryDict 上调用getlist(key)


因此,request.POST 是字典的子类,但不是原始字典。

它是 django MultiValueDict 类的子类,它是 dict 的子类。

当我对 Querydict 调用 get(key) 时,它会返回列表的最后一个值。听起来像 Querydict 中的 get 方法会覆盖原始字典中的 get 方法。

是的……这就是__getitem__ 方法的作用。

顺便说一句,我想知道为什么我们需要一个键有多个值。

这是因为 HTTP 允许请求中的给定参数有多个值。因此,如果可以提供多个值,django 需要能够通过HttpRequest.POST 对象使它们可用。

但由于这是一个不寻常的情况,他们决定只为您的代码的每个参数提供一个值......除非它特别要求所有参数。 Django 很有帮助。

【讨论】:

  • 因此,request.POST 是字典的子类,但不是原始字典。当我将 get(key) 调用到 Querydict 时,它会返回列表的最后一个值。听起来像 Querydict 中的 get 方法会覆盖原始字典中的 get 方法。顺便说一句,我想知道为什么我们需要一个键的多个值.... 我试过了,如果您的模板有多个具有相同 'name' 属性的 ,那么列表确实收到了包含多个值并且只返回最后一个。我想我可以使用这个以防“我需要用户在注册时输入两次密码”,新手的猜测,无论如何!
猜你喜欢
  • 2018-04-28
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
相关资源
最近更新 更多