2010-11-12 23 views
0

我有一個處理POST請求並嘗試創建新對象的視圖。但是,我知道某些POST數據是無效的......但我想修復它並繼續創建對象。如何在創建模型時從POST中覆蓋/更新信息

我能弄清楚能夠在ModelForm中「修復」數據的唯一方法是創建一個'is_valid()'表單。爲此,我可以使用POST數據創建表單,也可以使用已有的實例創建表單。不幸的是,如果我使用POST數據,因爲它的一些是無效的,表單將無法驗證,因此我無法獲取表單中的數據來修復它。如果我用一個已經存在的實例創建它,這會起作用,但是當顯示錶單時,任何剩餘的錯誤都會因爲任何原因而被忽略(並且因此不會顯示在網頁上)。我嘗試過創建POST數據中的Model表單並給它一個實例,但這似乎沒有幫助。另外,我試着修改POST數據(的副本),修正它,然後從「固定」POST數據創建ModelForm。這種作品,除了我的形式有一些ImageFields,他們似乎只是被忽略。

任何幫助將不勝感激。我看過我能找到的每一個好頁面都無濟於事。

也許有更好的方法來做到這一點?我試圖解決的問題是我想要一個包含ImageField的模型。我第一次張貼表格時,用戶需要爲每個字段「上傳」圖片。但是,如果他沒有更新某個字段的圖像,我希望新表單在沒有上傳圖像的字段中出現圖像上傳按鈕,並且只需要一個帶圖像圖像名稱的文本字段已上傳。


編輯9/15/2010:

好吧,我想我可以簡化上述所有問題的這個:

 
def testing(request) : 
    test_form = UserProfileForm() 
    valid = test_form.is_valid() 

    return render('testing.tmpl', locals(), request) 

當上面的代碼被呈現時,「有效'顯示爲False(正如人們所期望的那樣),但'test_form'呈現沒有任何錯誤。我已經閱讀了(如果可能還沒有理解?)Model和ModelForms的文檔,我發現大多數時候ModelForm(在我的情況下:UserProfileForm)是用指定的「實例」創建的。但是,1)我還沒有實例,2)我仍然期望非實例窗體顯示錯誤。我敢肯定,我錯過了一些東西。請照亮。 :)

還有一件事,也許上述答案將回答無論如何,但據我所知,is_valid()調用應該調用我爲UserProfileForm定義的'clean()'函數。然而,(不是Python大師)我把'ValidationError()'放在clean()的頂部,當我運行代碼時,沒有顯示錯誤。思考?

更新:我想出了問題,答案如下。謝謝!

+0

嗨大衛,歡迎來到StackOverflow。沒有必要對每個問題表示嗨和謝謝 - 它最終只是噪音,所以我將它移除了 – Casebash 2010-11-15 08:08:42

回答

0

如果您的ImageFields是可選的,那麼您仍然可以驗證它們(它們在其他方面是正確的)。

然後調整您的模板以顯示上傳的文件名或文件上傳字段,具體取決於他們是否已經上傳了一個。事實上,在第一種情況下給他們兩個領域可能會更好。這就是自動管理員所做的事情(上傳字段標記爲「更改」)。

0

那麼,在弄清楚如何使用python調試器(pdb)以及在emacs中這種「正常工作」(哇!)的事實後,我能夠發現我的(空的)表單沒有綁定。谷歌搜索結合的形式向我指出此頁:

http://docs.djangoproject.com/en/dev/ref/forms/api/

RTFM'ing我發現我可以通過一個空的字典,以我的表格,然後一切都開始表現爲我所期望的。因此,要總結,有一個很大的區別:

 
test_form = UserProfileForm() 

 
test_form = UserProfileForm({}) 

第二個版本導致窗體的渲染來顯示所有的錯誤(並稱之爲「乾淨()」 )。

有可能被版主刪除;感謝所有那些評論過並且耐心等待新django開發者的人。