免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2336 | 回复: 1
打印 上一主题 下一主题

Django实战(8):对比RoR与Django的输入校验机制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-20 20:50 |只看该作者 |倒序浏览
Django实战(8):对比RoR与Django的输入校验机制










rails有一个”简洁、完美的验证机制,无比强大的表达式和验证框架“。在《Agile Web Development with Rails 4th》一书的7.1节向我们展示了如何验证Product:
  1. ?class Product < ActiveRecord::Base
  2.     validates :title, :description, :image_url, :presence => true
  3.     validates :price, :numericality => {:greater_than_or_equal_to => 0.01}
  4.     validates :title, :uniqueness => true
  5.     validates :image_url, :format => {
  6.         :with => %r{\.(gif|jpg|png)$}i,
  7.         :message => 'must be a URL for GIF, JPG or PNG image.'
  8.     }
  9. end
复制代码
还是需要解释一下:

validates :title, :description, :image_url, :presence => true :这三个字段不能为空。rails默认是允许为空。而且由于model与migration是分开定义的,你可以在migration中定义字段不能为空而model中可以为空,或者反之。
validates :price, :numericality => {:greater_than_or_equal_to => 0.01}:price字段应该是有效的数字并且不小于0.01
validates :image_url, :format => {…}: image_url 必须以三种扩展名结尾,这里没有验证是否为有效的url

更加可怕的是,这个验证语法是rails3.0开始支持的,而在此之前的版本要写成这样:
  1. ?class Product < ActiveRecord::Base
  2.     validates_presence_of :title, :description, :image_url
  3.     validates_numericality_of :price
  4.     validates_format_of :image_url,:with => %r{^http:.+.(gif|jpg|png)$}i,
  5.     :message => "must be a URL for a GIF, JPG, or PNG image"
  6.     protected
  7.         def validate
  8.             errors.add(:price, "should be positive") unless price.nil? || price > 0.0
  9.         end
  10. end
复制代码
再让我们看看”简洁“的rails验证还有哪些功能(旧版语法):
validates_acceptance_of: 验证指定checkbox应该选中。这个怎么看都应该是form中的验证而与model无关
validates_associated:验证关联关系
validates_confirmation_of:验证xxx与xxx_confirmation的值应该相同。  这个怎么看也应该是form中的验证而与model无关
validates_length_of:检查长度
validates_each     使用block检验一个或一个以上参数
validates_exclusion_of 确定被检对象不包括指定数据
validates_inclusion_of  确认对象包括在指定范围
validates_uniqueness_of检验对象是否不重复
也许还有more and more, and more, and more…



回到Django。Django的验证有3层机制:
1. Field类型验证。除了能够对应到数据库字段类型的Field类型外,还有 EmailField,FileField,FilePathField,ImageField,IPAddressField,PhoneNumberField、 URLField、XMLField等,
2. Field选项验证。如,null=true,blank=true, choices,editable,unique,unique_for_date,unique_for_month,unique_for_year 等等。有些Field还有自己独有的选项,也可以用来约束数据。
3. 表单(Form)验证。还可以在Form中定义验证方法。可以定义整个Form的验证方法 clean,或者针对某个表单项的验证方法:clean_xxx。



前面建立的Product模型中,已经默认加入了不能为空、要求符合数字等验证,所以还需要进行如下验证:
1.验证price>0:需要在Form中验证;
2. 验证title唯一:在Model中验证;
3. 验证image_url的扩展名:在Form中验证,还可以顺便在Model中将其改为URLField类型。

论坛徽章:
0
2 [报告]
发表于 2012-02-20 20:50 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP