[英]Django QueryDict How to ensure that the "plus" does not disappear in the QueryDict?
[英]How to change a django QueryDict to Python Dict?
假设我有以下 QueryDict:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
我想要一本字典,例如:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(我不在乎 unicode 符号u
是留下还是消失。)
如果我按照django 站点的建议执行queryDict.dict()
,我会丢失属于var1
的额外值,例如:
{'num': [0], 'var1':['value2'], 'var2':['8']}
我正在考虑这样做:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
有没有更好的办法?
Django >= 1.4 中的新功能。
QueryDict.dict()
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
这应该有效: myDict = dict(queryDict.iterlists())
这就是我最终使用的:
def qdict_to_dict(qdict):
"""Convert a Django QueryDict to a Python dict.
Single-value fields are put in directly, and for multi-value fields, a list
of all values is stored at the field's key.
"""
return {k: v[0] if len(v) == 1 else v for k, v in qdict.lists()}
根据我的用法,这似乎为您提供了一个列表,您可以将其发送回例如表单构造函数。
编辑:也许这不是最好的方法。 看来,如果您想出于任何疯狂的原因将QueryDict
写入文件, QueryDict.urlencode()
就是要走的路。 要重建QueryDict
,您只需执行QueryDict(urlencoded_data)
。
只需简单地添加
queryDict=dict(request.GET)
或queryDict=dict(QueryDict)
在您的视图中,数据将作为 python Dict 保存在 querDict 中。
from django.utils import six
post_dict = dict(six.iterlists(request.POST))
如果您不希望将值作为数组,您可以执行以下操作:
# request = <QueryDict: {u'key': [u'123ABC']}>
dict(zip(request.GET.keys(), request.GET.values()))
{u'key': u"123ABC" }
# Only work for single item lists
# request = <QueryDict: {u'key': [u'123ABC',U 'CDEF']}>
dict(zip(request.GET.keys(), request.GET.values()))
{u'key': u"CDEF" }
zip 是一个强大的工具在这里阅读更多关于它http://docs.python.org/2/library/functions.html#zip
我遇到了类似的问题,想将表单中的任意值保存为序列化值。
我的回答避免显式迭代字典内容: dict(querydict.iterlists())
为了检索一个类似于字典的值作为原始值,逆函数使用QueryDict.setlist()
来填充一个新的QueryDict
值。 在这种情况下,我不认为显式迭代是可以避免的。
我的辅助函数如下所示:
from django.http import QueryDict
def querydict_dict(querydict):
"""
Converts a Django QueryDict value to a regular dictionary, preserving multiple items.
"""
return dict(querydict.iterlists())
def dict_querydict(dict_):
"""
Converts a value created by querydict_dict back into a Django QueryDict value.
"""
q = QueryDict("", mutable=True)
for k, v in dict_.iteritems():
q.setlist(k, v)
q._mutable = False
return q
更新:
myDict = dict(queryDict._iterlists())
请注意:queryDict 的queryDict
方法中的下划线_
。 Django 版本:1.5.1
dict(request.POST)
返回一个带有数组包装值的奇怪 python 字典。
{'start': ['2017-01-14T21:00'], 'stop': ['2017-01-14T22:00'], 'email': ['sandeep@sakethtech.com']}
其中{x:request.POST.get(x) for x in request.POST.keys()}
返回预期的输出。
{'start': '2017-01-14T21:00', 'stop': '2017-01-14T22:00', 'email': 'sandeep@sakethtech.com'}
使用Django 2.2
有几个干净的解决方案:
QueryDict.dict()
是最简单的,但它会破坏QueryDict
与列表作为值,例如:from django.http.request import QueryDict, MultiValueDict
query_dict = QueryDict('', mutable=True)
query_dict.update(MultiValueDict({'a': ['one', 'two']}))
query_dict.update({'b': 'three'})
for key, value in query_dict.dict().items(): # ---> query_dict.dict()
print(key, value)
将输出
a two # <--- missed 'one'
b three
dict(QueryDict)
更好,因为它会生成正确的列表字典:from django.http.request import QueryDict, MultiValueDict
query_dict = QueryDict('', mutable=True)
query_dict.update(MultiValueDict({'a': ['one', 'two']}))
query_dict.update({'b': 'three'})
for key, value in dict(query_dict).items(): # ---> dict(query_dict)
print(key, value)
将输出
a ['one', 'two']
b ['three']
哪个是对的。
这就是我解决这个问题的方法:
dict_ = {k: q.getlist(k) if len(q.getlist(k))>1 else v for k, v in q.items()}
我尝试了dict(request.POST)
和request.POST.dict()
并意识到如果您的request.POST
中嵌套了例如'var1':['value1', 'value2']
list
值,则后者( request.POST.dict()
) 只允许我访问嵌套列表中的最后一项,而前者( dict(request.POST)
) 允许我访问嵌套列表中的所有项目。
我希望这可以帮助别人。
和我一样,你可能更熟悉 Python 中的Dict()
方法。 但是, QueryDict()
也是一个易于使用的对象。 例如,也许您想从request.GET QueryDict()
中获取值。
你可以这样做: request.GET.__getitem__(<key>)
。
QueryDict()
文档: https ://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDict
你可以使用一个简单的技巧
queryDict._mutable = False
# Change queryDict
your_dict = {'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
queryDict.upate(your_dict)
# reset the state
queryDict._mutable = True
我认为这会更好地帮助你: 这个 QueryDict 实例是不可变的
user_obj = get_object_or_404(NewUser,id=id)
if request.method == 'POST':
queryDict = request.POST
data = dict(queryDict)
print(data['user_permissions[]'])
user_obj.user_permissions.clear()
user_obj.user_permissions.set(data['user_permissions[]'])
return HttpResponse('Done')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.