2009-03-03 45 views
0

我對Python,Django有點新,我想就如何佈局我想寫的代碼進行一些建議。模型和驗證混淆 - 尋找建議

我寫的模型允許上傳文件。在模型保存方法中,我正在檢查文件是否有特定的擴展名。如果它具有XML擴展名,我打開文件並從文件中獲取一些信息以保存在數據庫中。我有這個模型的工作。我已經在內置的管理中測試過它。有用。

當前有錯誤(它不是一個XML文件;該文件無法打開;一個特定的屬性不存在)我拋出一個自定義的「異常」錯誤。我想喜歡做的是一些如何將這些「異常」錯誤消息傳遞給視圖(無論是自定義視圖還是內置管理視圖),並顯示錯誤消息,如果正在使用表單庫。那可能嗎?

我開始認爲我將不得不再次使用表單庫編寫驗證檢查。如果是這樣的話,是否仍然可以使用內置的管理模板,但擴展它用於添加這些自定義驗證的表單?

任何有助於我的困惑,將不勝感激。


UPDATE:

這裏是到目前爲止我的模型,對於那些誰問, 「NZB」 是XML文件中的字段。
http://dpaste.com/hold/6101/

管理界面將使用您與您的模型相關聯的形式;你自己的觀點也可以使用表格。

這正是我想要做的。但是,我不知道如何將我的表格與我的模型關聯起來。當我過去創建表格時,他們一直扮演着自己的角色。我無法讓管理視圖在使用ModelForm類時使用它們。你能指出這點嗎?

我讀過你給我的鏈接,它接縫是我過去做的,沒有運氣。

從文件中獲取屬性,應該可能是一種方法。

對不起,請您詳細說明一下嗎?一種方法?


UPDATE:

它接縫我已經compleatly缺少這個步驟的形式鏈接到管理視圖。 http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin

這現在應該允許我在窗體中進行驗證。但是,我仍然對如何處理驗證感到困惑。 S.洛特說它應該是一種方法?

回答

4

表單錯誤自動成爲管理視圖的一部分。

http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation

你是最幸福的,如果你在表單驗證 - 這就是形式是。管理界面將使用您與模型關聯的表單;你自己的觀點也可以使用表格。

從文件中獲取屬性,應該可能是模型類的一個單獨的方法。模型類的單獨方法可以被模型類的save()方法使用,或者在其他時候被視圖函數調用。


「在使用ModelForm類時,我永遠無法獲得管理視圖來使用它們。」

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin


「我仍然感到困惑如何實際處理驗證。美國洛特說,這應該是一個方法?」

通過clean()方法或clean_somefield()方法完成表單中的驗證。

「將自定義驗證添加到管理員」鏈接(上面)顯示瞭如何將clean_name方法添加到「MyArticleAdminForm」窗體。

如果您仍然感到困惑,請嘗試從Django網頁上輸入代碼並查看它的功能。

+0

我已更新我的問題,提供更多信息。你能再看一次嗎?你縫合以準確理解我想要做什麼,但是我仍然不知道如何去做。具體來說,將表單與模型關聯起來,讓管理層選擇模型表單的驗證錯誤。 – 2009-03-04 15:56:02

+0

謝謝!我希望我能給你100票! – 2009-03-04 17:00:23

1

我想最好的辦法是實現一個特殊的字段類,擴展FileField與上傳文件的自定義驗證。

驗證在該字段的clean方法中實施。它應該檢查XML文件並在遇到錯誤時提出ValidationError。管理員系統應該像處理其他任何現場錯誤一樣處理您的自定義錯誤。

ImageField類是這樣的特殊驗證的一個很好的例子 - 我推薦just reading through the source

1

您可以提供管理網站將使用的表單。然後,您可以在管理區域中顯示的表單代碼中執行驗證。

請參閱管理網站上的文檔,特別是the form attribute of ModelAdmin

0

「我拋出一個自定義的」異常「錯誤」 - 你究竟在哪裏拋出異常?在你的模型中還是在你的視圖中?

我很困惑你的問題,所以我假設你應該問'我應該在哪裏捕捉輸入錯誤,如果有的話? '給你自己。

我看到的模型和視圖就像一條小型裝配線中的零件。 查看/表單驗證是應該執行的第一個操作。如果通過表單輸入數據有任何問題。應該使用form.is_valid()等形式級別來阻止它。

模型功能應該是提供有關除了執行CRUD以外的實體本身的元信息。理想情況下,不應該對它爲CRUD操作獲得的數據感到困擾。