Django_form验证
需求:
当用户向Django后端以post提交数据的时候,无论前端是否进行数据合法验证,后端都需要对客户端提交过来的数据进行数据合法性验证,是否可以利用models中表类字段的约束来实现验证,并且可以进一步对某个单独的字段进行自定义验证,并保存呢?
那,如何满足这个需求呢?
- 从Django中 导入forms
- 定义一个form类,继承forms.ModelForm
- 类中定义一个Meta,指定model=表类名, fields=[ ] 列表中添加想要验证的字段
- 在和Meta同级定义一个 def函数,函数名为:clean_字段名 方式进行对某个字段的特殊处理,并可以改变这个字段的属性
- view中导入这个form类,实例化时候,把request.POST传递进去,通过object.is_valid()判断是否验证成功,验证失败通过object.errors提交错误信息
- form验证成功的数据,放在object.cleaned_data中,以字典的形式存放
__author__ = 'beimenchuixue'
__blog__ = 'http://www.cnblogs.com/2bjiujiu/' # form.py文件中
import re
# 此form验证用户咨询表UserAsk中三个字段,name、mobile、course_name
# Meta直接利用数据库的约束条件进行字段验证,但是mobile的值要经过特殊验证
class UserAskFrom(forms.ModelForm): class Meta:
model = UserAsk
fields = ['name', 'mobile', 'course_name'] def clean_mobile(self):
# 对手机号码进行严格验证clean_+字段名
mobile = self.cleaned_data['mobile']
REGEX_MOBILE = '^1[358]\d{9}|^147\d{8}|^176\d{8}$'
p = re.compile(REGEX_MOBILE)
if p.match(mobile):
return mobile
else:
return forms.ValidationError(u'手机号码错误', code='mobile_invalid') # view.py文件中
# view中实例化时候,直接通过实例对象.save(commit=True)保存验证好的数据
class AddUserAskView(View):
"""课程咨询"""
def post(self, request):
# 把request.POST传递进去,要求post的key值和form中fields保持一致
user_ask_form = UserAskFrom(request.POST)
if user_ask_form.is_valid():
# 验证成功直接保存, commit=True 表示提交
user_ask_form.save(commit=True) # 对前端传过来的文件,进行验证并且保存,文件传输,必须保证为用户已经验证登录
# 以用户更换头像为例子,LoginRequiredMixin要求登录的基类 :http://www.cnblogs.com/2bjiujiu/p/7452902.html
class UpLoadImageView(LoginRequiredMixin, View):
"""更换图片"""
def post(self, request):
# 对于上传的文件,放到request.FILES中,instance=request.user指定验证表字段中的一个唯一数据,对该数据有就更新,没有就增加
image_form = UpLoadImageForm(request.POST, request.FILES, instance=request.user)
if image_form.is_valid():
# 自己通过表单对象save方法进行保存数据
image_form.save()
# 返回json数据,包含状态码
return HttpResponse("{'status':'success'}", content_type='application/json')
else:
return HttpResponse("{'status':'fail'}", content_type='application/json')
Django_form验证的更多相关文章
- Django_Form验证(三)字段,字段的参数,widgets种类
Form工具是一个很强大的工具,所以他的功能不仅仅是上面2个例子,这里详细记录一下Form的其他功能 字段的一般参数,以CharFields为列子: user=fields.CharField( re ...
- Django_Form验证(二),ajax验证
还是一个简单的html提交页面,ajax提交就不需要form表单了: <p><input id="a" type="text" name=&q ...
- Django_Form验证(一)
Django为我们提供了一个模板来做Form验证,不需要我们再去写复杂的验证代码了 简单的提交信息html页面: <form action="/fff/Form" metho ...
- Django之Form、ModelForm 组件
Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- DjangoForm 提交验证
用户提交数据的验证 1.创建模版 -- class LoginForm(forms.Form):.... 2.将请求交给模版,创建一个对象 -- obj = LoginForm(request.POS ...
- 【探索】无形验证码 —— PoW 算力验证
先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...
- C# 中参数验证方式的演变
一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...
- Yii1.1的验证规则
在Yii1.1的数据验证是由CValidator完成,在CValidator中提供了各种基本的验证规则 <?php public static $builtInValidators=array( ...
随机推荐
- 【动态规划】洛谷P1006传纸条
题目描述: 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的 ...
- Error: Your project contains C++ files but it is not using a supported native build system
我在编写有关JNI的代码的时候回报这个错误,我在网上搜了相关的资料后,找到了一篇文章解决了这个问题,点击这里查看这篇文章,我在照着这篇文章尝试的时候,总有一些错误,现在我把自己详细的解决流程贴出来,供 ...
- 通用后台管理系统UI-AdminLTE:构造动态菜单栏
AdminLTE是一款基于bootstrap的后台管理系统的通用模板UI,它的样式美观且较为符合大多数后台管理系统的需求,典型的上|左右|下的布局形式.并且提供了一整套我们开发的时候可能用到的UI样式 ...
- Python 浅析线程(threading模块)和进程(process)
线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程与线程 什么 ...
- jsp+struts2登录框架模板
一.建立一个名叫jsp_struts2的项目 二.导入jar包 如上图:jar包导入在WebContent/WEB-INF/lib下 三.建立一个LoginAction类 LoginAction类的s ...
- ----------- Rootkit 核心技术之绕过 IopParseDevice() 调用源检测逻辑 ---------------
---------------------------------------------------------------- 在上一篇文章中,我们已经看到 IopParseDevice() 如何对 ...
- Angular17 Angular自定义指令
1 什么是HTML HTML文档就是一个纯文本文件,该文件包含了HTML元素.CSS样式以及JavaScript代码:HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲 ...
- 循序渐进之Spring AOP(3) - 配置代理
上一篇介绍了几种Advice(增强),并通过代码演示了生成代理的方式,下面来看通过配置文件配置方式把Advice织入目标类. 注意,配置文件方式仍然不是spring AOP的最好方式,学习配置方式也是 ...
- TCP/IP(六)应用层(DNS和HTTP协议)
前言 到这一篇我已经把TCP/IP五层模型详细的说明了一遍,大体的从物理层到最上层的应用层做了一个大概的了解,其实总体学下来东西非常的多,我们需要经常的去系统性的去学习它.不然过一段时间就忘记了! 回 ...
- BZOJ:4869: [Shoi2017]相逢是问候
4869: [Shoi2017]相逢是问候 先说点正经的…… 显然做了有限次(我只知道是有限次,而且不会大,别人说是log次?)修改以后会达到不动点,即以后怎么修改都不变了. 然后就随便做了.(3个l ...