2011-07-01 57 views
0

我有幾個關於模型和表單驗證的問題。你能幫我解決這些問題嗎:幫助驗證模型和表單


應該在哪裏進行驗證?它應該在模型還是表單中?正確的做法是在模式中使用驗證器的形式和約束條件?


在窗體中寫入'clean_'方法和編寫驗證程序有什麼區別?我看到人們經常在'clean_'方法中進行驗證檢查。


在我正在處理的要求,我在叫「活」的URL字符串設置了一個param。這通常是1或0.什麼是以我的形式定義這個的正確方法?我需要驗證它是一個數字,只能是1或0.這是正確的方式?

alive = models.IntegerField(null=False, max_value=1, min_value=0) 

如何定義這個字段即,如果該參數不通過,我默認爲0(假)的默認值。

我沒有在客戶端的窗體。我使用Django表單來驗證我的JS POST請求。


在一個模型字段中,我需要以1234x4321格式存儲屏幕分辨率。我是否應該將此聲明爲CharField中添加一些正則表達式驗證模型和窗體?任何正則表達式驗證的例子都會有幫助。


謝謝。

回答

1

驗證應該在表單上進行,而不是模型。但是,如果您使用的ModelForms通常具有很大的意義,它將繼承模型本身的某些驗證規則(那些特定於數據庫的驗證規則,如maximum_field長度,數據庫字段類型,但如果它們可以留空)。

form = SomeForm(initial={'alive' : 0}) 

雖然在你的情況下,看來,如果能夠獲得的值只有0和1這將是有意義的:

一個字段的默認值應該與它的構造函數傳遞改爲使用BooleanField(在這種情況下,它將默認爲false)。

在解決方案的情況下,我會創建一個可能的解決方案和一些任意值之間的映射。

RESOLUTIONS = (            
     ("1","800x600"), 
     ("2","1024x768"),        
     .....       
) 

,然後將它傳遞給模型:

resolutions = models.CharField(RESOLUTIONS, max_length=1) 

從而使用戶得到一個選擇字段與相應的選項和值。另一方面,如果你需要用戶插入他/她自己,使用兩個字段(一個用於寬度,另一個用於高度)比驗證用戶輸入容易得多。

所以,你可以定義模型的方法:

def get_resolution(self): 
    return "%sx%s" % (self.width, self.height) 
+0

嗨UKU,我想存儲在XXXXXXXXX格式的分辨率是因爲在我們的例子中,我們有很多的組合。你能告訴我什麼樣的驗證和約束我需要實現這個?謝謝。 –

+0

好吧,不需要過分複雜的東西,只需將它們保存在不同的領域,一個爲高度,另一個爲寬度。 –

+0

Hey Uku,你說得對。另一件事:我有一個Django應用程序,它接受一個JS請求並將數據存儲到一堆模型中。沒有發佈這個的客戶表單。這是JS計算的東西,並在幕後提出請求。建議 - 爲整個請求創建一個表單,重寫表單的保存方法並添加邏輯以將數據保存到相應的模型中 - 或 - 爲每個需要數據的模型創建單獨的模型表單得救嗎? –