2017-10-20 107 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']