转换请求时遇到困难.Django中的POST值



在我的Django应用程序中,我有一个POST请求QueryDict,我正在尝试更改它的值。我知道QueryDict对象是不可变的,所以我实例化了一个可变的QueryDict项。问题的关键是,该值是一个逗号分隔的数字字节串,来自应用程序前端的AJAX调用,例如U"2,4,6,7"。

QueryDict中的每个键值本质上都是一个值列表[U'2',U'4'],所以我需要将从前端发布的单个字节U"2,4,6,7"更改为字节字符串列表[U'1',U'%4',U'6','7']。然而,问题是每当我尝试对字符串进行拆分并将请求POST键值分配给新的拆分字符串时,键值就是列表中的列表。例如{‘experise’:[[U'2',U'4']]}。我尝试了一种人为的解决方案,通过迭代值的拆分列表,并将它们附加到请求POST项的键值中,但它给了我错误

AttributeError: 'unicode' object has no attribute 'append'

在一个可变的QueryDict对象中,如果每个QueryDict项都是一个列表,并且它没有值append,那么如何编辑列表项呢?有没有更简单的方法来实现这一点?

查看功能代码

mentors = Mentor.objects.filter(is_active=True, is_verified=True).order_by('last_name', 'first_name')
ajax_post = dict(request.POST.iteritems())
post = QueryDict('', mutable=True)
post.update(ajax_post)
for key in post:
postlist = post[key].split(',')
for item in postlist:
post[key].append(item)
# First attempt that gives list in a list
# for item in post:
#    post[key] = post[key].split(',')
form = MentorSearchForm(data=post)
if form.is_valid():
mentors = filter_mentors(form.cleaned_data)

你被QueryDict.__setitem__抓住了。执行querydict['key'] = value时,会将密钥设置为[value],而不是value

您可以使用QueryDict.setlist方法将给定密钥设置为给定列表。

querydict = QueryDict('', mutable=True)
for key in request.POST.iteritems():
postlist = post[key].split(',')
querydict.setlist(key, postlist)

由于您将遍历post数据中的每个键,我认为您可以从代码中删除update()步骤。

如果我正确理解了约束,那么应该使用内置数组类型。

>>> q =  U"2,4,6,7"
>>> import array
>>> ary = array.array('u', q)
>>> [i for i in ary if i.isdigit()]
[u'2', u'4', u'6', u'7']

最新更新