Django实战(8):对比RoR与Django的输入校验机制
rails有一个”简洁、完美的验证机制,无比强大的表达式和验证框架“。在《Agile Web Development with Rails 4th》一书的7.1节向我们展示了如何验证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
还是需要解释一下:
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开始支持的,而在此之前的版本要写成这样:
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
再让我们看看”简洁“的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类型。
Django实战(8):对比RoR与Django的输入校验机制的更多相关文章
- Django实战(6):对比RoR和Django的模板系统
scaffold的生成物虽然用处不大,但是给我们带来一些最佳实践.其中就有模板的继承和分区. 如果你深入使用过rails的模板体系,那么恭喜你:你有超强的忍耐力!而且更重要的是,你只需要3分钟就可以理 ...
- Django实战(16):Django+jquery
现在我们有了一个使用json格式的RESTful API,可以实现这样的功能了:为了避免在产品列表和购物车之间来回切换,需要在产品列表界面显示购物车,并且通过ajax的方式不刷新界面就更新购物车的显示 ...
- Django实战(15):Django实现RESTful web service
曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful w ...
- Django实战(3):Django也可以有scaffold
rails有一个无用的”神奇“功能,叫做scaffold.能够在model基础上,自动生成CRUD的界面. 说它无用,是因为rails的开发者David说,scaffold”不是应用程序开发的目的.它 ...
- 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程
点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...
- 6、Django实战第6天:用户登录
今天开始,我们需要来写后台逻辑了.... 后台逻辑代码都是编写在views.py文件里面,今天要完成的登录功能,因此来编辑users.views.py 这里我们根据请求方法来判断分为2种情况,网页默认 ...
- Django实战-用户注册和登陆系统
1.环境搭建和创建项目 1.环境搭建 每当我们开始一个新项目的时候,通常都会搭建一个全新.独立.隔离的项目环境,这样做的好处自然不必多说.有很多种建立项目虚拟环境的工具,使用比较普遍的是Python中 ...
- 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)
<跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...
- python框架Django实战商城项目之工程搭建
项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...
随机推荐
- JavaApplet-Application Blocked..Your security setting have blocked an untrusted application from running..
From:http://www.cnblogs.com/killerlegend/p/3892668.html Author:KillerLegend Date:2014.8.5 在看A*算法的时候, ...
- 模块型css样式
<div id="dowork"> <div id="dowork_on">۞作业进行中</div> <div id= ...
- Java并发编程原理与实战二十二:Condition的使用
Condition的使用 Condition用于实现条件锁,可以唤醒指定的阻塞线程.下面来实现一个多线程顺序打印a,b,c的例子. 先来看用wait和notify的实现: public class D ...
- HDU 4825 Xor Sum (裸字典树+二进制异或)
题目链接 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将 ...
- webpack构建react多页面应用
写这个的初衷是很难找一个简洁的项目脚手架,很多脚手架都有很多依赖,光看依赖就要很久,所以自己参照网上的内容,弄个这么一个简单的多页面的脚手架. 利用creat-react-app 新建一个react应 ...
- 差分约束系统 + spfa(A - Layout POJ - 3169)
题目链接:https://cn.vjudge.net/contest/276233#problem/A 差分约束系统,假设当前有三个不等式 x- y <=t1 y-z<=t2 x-z< ...
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...
- MySQL权限操作:Grant、Revoke
数据库操作: 创建数据库.创建表——CREATE 删除数据库.删除表——DROP 删除表内容——TRUNCATE.DELETE(后者效率低.一行一行地删除记录) 查询数据库.查询表——SELECT 插 ...
- 进程同步——哲学家进餐问题Java实现
哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题. 问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条.哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿 ...
- Python获取指定文件夹下的文件名
本文采用os.walk()和os.listdir()两种方法,获取指定文件夹下的文件名. 一.os.walk() 模块os中的walk()函数可以遍历文件夹下所有的文件. os.walk(top, t ...