2012-02-01 66 views
2

我有一個簡單的Django活塞處理程序,它可以創建模型的新實例並將其保存。django活塞發送請求將字符串更改爲列表

從客戶端,我發佈使用Javascript對象和JQuery.post。

在使用Firebug檢查數據,後弦看起來是這樣的:

classification=&organization=&title=Formatting+Test+7&description=test&created_by=created_on=&last_modified=&csrfmiddlewaretoken=a8352bb51f88c271119a81228a5c291f 

正如你所看到的,只有標題,描述和csrfmiddlewaretoken設置。

裏面的活塞處理程序,在任何其他代碼運行之前的創建方法的頂部,我打印出來的request.POST:

print 'POST:', request.POST 

它打印在Django的開發服務器的輸出如下:

POST: <QueryDict: {u'description': [u'test'], u'classification': [u''], u'title': [u'Formatting Test 7'], u'created_by': [u''], u'created_on': [u''], u'last_modified': [u''], u'organization': [u''], u'csrfmiddlewaretoken': [u'a8352bb51f88c271119a81228a5c291f']}> 

正如你所看到的,所有的數據現在都在列表中。當我使用Django表單保存數據時,它將列表轉換爲字符串,當數據顯示在客戶機上時,它將顯示「[u'Formatting Test 7']」,而不是「格式化Test 7」。

谷歌搜索似乎沒有返回任何人有同樣的問題,我一直在使用活塞超過6個月,我從來沒有見過這樣的錯誤之前。

編輯:正如JPIC所說,我認爲我遇到的錯誤不是一個錯誤,而是設計。我的問題是在使用Django表單之前擴展QuerySet中的數據。

錯誤的方式:

some_initial_data = { 
    'created_by': creator.pk, 
    'organization': org.pk, 
    'classification': 7 
} 
post = dict(request.POST) 
post.update(some_initial_data) 
form = MyModelForm(post) 

正確方法:

如在更新方法的QueryDict描述:https://docs.djangoproject.com/en/1.3/ref/request-response/#querydict-objects

some_initial_data = { 
    'created_by': creator.pk, 
    'organization': org.pk, 
    'classification': 7 
} 
post = request.POST.copy() 
post.update(initial_data) 
form = MyModelForm(post) 

回答

2

一個錯誤,你的數據一直都是這樣的一個清單,它是來自Django的設計決定。無論代碼如何訪問QueryDict實例並獲取列表值,除了使用getlist()方法之外,都是使用QueryDict錯誤。

QueryDict允許多個值爲一個關鍵即:foo=bar&foo=test您的QueryDict將像{u'foo': [u'bar', u'test']}

例與?foo=bar&foo=test&x=y

ipdb> request.GET 
<QueryDict: {u'x': [u'y'], u'foo': [u'bar', u'test']}> 
ipdb> request.GET['x'] 
u'y' 
ipdb> request.GET.getlist('x') 
[u'y'] 
ipdb> request.GET['foo'] 
u'test' 
ipdb> request.GET.getlist('foo') 
[u'bar', u'test'] 

正如你所看到的,是的QueryDict,不會訴諸默認的實際名單列表的字典:它會像一個正常的字典。所以如果一些代碼獲得列表,那麼它使用QueryDict錯誤。

有一兩件事值得一mentionning是,如果你想使用$.post(url, {'foo':['bar', 'test']}),那麼你將需要調用$ .ajaxSettings.traditional =真

這對於複選框或多重選擇很有用。糾正我,如果我錯了,但這是標準的,並且PHP方式foo [] = bar & foo [] = test不是標準的。

+0

謝謝,這很有幫助。它讓我明白,問題在於我在將數據放入表單之前如何更新數據。查看我的問題中的解決方案的編輯。 – MrOodles 2012-02-01 16:53:46

相關問題