- 論壇徽章:
- 0
|
Django實(shí)戰(zhàn)(8):對(duì)比RoR與Django的輸入校驗(yàn)機(jī)制
rails有一個(gè)”簡(jiǎn)潔、完美的驗(yàn)證機(jī)制,無(wú)比強(qiáng)大的表達(dá)式和驗(yàn)證框架“。在《Agile Web Development with Rails 4th》一書(shū)的7.1節(jié)向我們展示了如何驗(yàn)證Product:- ?class Product < ActiveRecord::Base
- validates :title, :description, :image_url, :presence => true
- validates :price, :numericality => {:greater_than_or_equal_to => 0.01}
- validates :title, :uniqueness => true
- validates :image_url, :format => {
- :with => %r{\.(gif|jpg|png)$}i,
- :message => 'must be a URL for GIF, JPG or PNG image.'
- }
- end
復(fù)制代碼 還是需要解釋一下:
validates :title, :description, :image_url, :presence => true :這三個(gè)字段不能為空。rails默認(rèn)是允許為空。而且由于model與migration是分開(kāi)定義的,你可以在migration中定義字段不能為空而model中可以為空,或者反之。
validates :price, :numericality => {:greater_than_or_equal_to => 0.01}:price字段應(yīng)該是有效的數(shù)字并且不小于0.01
validates :image_url, :format => {…}: image_url 必須以三種擴(kuò)展名結(jié)尾,這里沒(méi)有驗(yàn)證是否為有效的url
更加可怕的是,這個(gè)驗(yàn)證語(yǔ)法是rails3.0開(kāi)始支持的,而在此之前的版本要寫(xiě)成這樣:- ?class Product < ActiveRecord::Base
- validates_presence_of :title, :description, :image_url
- validates_numericality_of :price
- validates_format_of :image_url,:with => %r{^http:.+.(gif|jpg|png)$}i,
- :message => "must be a URL for a GIF, JPG, or PNG image"
- protected
- def validate
- errors.add(:price, "should be positive") unless price.nil? || price > 0.0
- end
- end
復(fù)制代碼 再讓我們看看”簡(jiǎn)潔“的rails驗(yàn)證還有哪些功能(舊版語(yǔ)法):
validates_acceptance_of: 驗(yàn)證指定checkbox應(yīng)該選中。這個(gè)怎么看都應(yīng)該是form中的驗(yàn)證而與model無(wú)關(guān)
validates_associated:驗(yàn)證關(guān)聯(lián)關(guān)系
validates_confirmation_of:驗(yàn)證xxx與xxx_confirmation的值應(yīng)該相同。 這個(gè)怎么看也應(yīng)該是form中的驗(yàn)證而與model無(wú)關(guān)
validates_length_of:檢查長(zhǎng)度
validates_each 使用block檢驗(yàn)一個(gè)或一個(gè)以上參數(shù)
validates_exclusion_of 確定被檢對(duì)象不包括指定數(shù)據(jù)
validates_inclusion_of 確認(rèn)對(duì)象包括在指定范圍
validates_uniqueness_of檢驗(yàn)對(duì)象是否不重復(fù)
也許還有more and more, and more, and more…
回到Django。Django的驗(yàn)證有3層機(jī)制:
1. Field類(lèi)型驗(yàn)證。除了能夠?qū)?yīng)到數(shù)據(jù)庫(kù)字段類(lèi)型的Field類(lèi)型外,還有 EmailField,F(xiàn)ileField,F(xiàn)ilePathField,ImageField,IPAddressField,PhoneNumberField、 URLField、XMLField等,
2. Field選項(xiàng)驗(yàn)證。如,null=true,blank=true, choices,editable,unique,unique_for_date,unique_for_month,unique_for_year 等等。有些Field還有自己獨(dú)有的選項(xiàng),也可以用來(lái)約束數(shù)據(jù)。
3. 表單(Form)驗(yàn)證。還可以在Form中定義驗(yàn)證方法?梢远x整個(gè)Form的驗(yàn)證方法 clean,或者針對(duì)某個(gè)表單項(xiàng)的驗(yàn)證方法:clean_xxx。
前面建立的Product模型中,已經(jīng)默認(rèn)加入了不能為空、要求符合數(shù)字等驗(yàn)證,所以還需要進(jìn)行如下驗(yàn)證:
1.驗(yàn)證price>0:需要在Form中驗(yàn)證;
2. 驗(yàn)證title唯一:在Model中驗(yàn)證;
3. 驗(yàn)證image_url的擴(kuò)展名:在Form中驗(yàn)證,還可以順便在Model中將其改為URLField類(lèi)型。
|
|