2017-10-20 68 views
0

在我的Django应用程序中,我有一个POST请求QueryDict,其值正在尝试更改。我知道QueryDict对象是不可变的,所以我实例化了一个可变的QueryDict项目。问题的关键在于,该值是由应用程序前端中的AJAX调用进入的逗号分隔数字的字节串,例如, U “2,4,6,7”。在Django中转换request.POST的困难

QueryDict中的每个关键值本质上都是一个值列表[U'2',U'4'],所以我需要更改从我的前端发布的单个字节U“2,4,6,7”结束为字节串[U'2',U'4',U'6','7']的列表。然而,问题是每当我尝试对字符串进行拆分并将请求POST键值分配给该新的拆分字符串时,键值就是列表中的列表。例如{'专长':[[U'2',U'4']]}。我尝试了人为的解决方案通过价值观的分裂列表迭代,并将这些信息附加到信息发布项目的核心价值,但它给我的错误

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

在一个可变的QueryDict对象,如果每个的QueryDict item是一个列表,它没有附加值,比编辑列表项目的方式要多。有没有更简单的方法来完成这一点?

查看功能代码

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) 
+1

你应该解释为什么你想修改querydict,而不是写表单验证,以便它接受发布的内容。 –

+0

(并且Python列表无论如何都没有称为'push'的方法;也许你的意思是'append'?) –

+0

是的,我的意思是追加。对不起,我一直在从python到javascript,有时会互换这些条款。 – JBT

回答

2

你被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) 

既然你是通过在后的数据每个键要循环,我想你可以删除你的代码中update()一步。

1

如果我理解正确的约束,你应该使用builtin array type

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