form+ajax实现验证

#obj.errors返回的是ErrorDict,不是字典(虽然继承字典)
#obj.errors.as_json() 返回的字符串(前端要连续反解两次)
#obj.errors.as_data() 返回原生的字典 但是返回value 是ValidationError,不能直接序列化 1)通过errors.as_data()实现数据绑定和返回,errors.as_data() 返回原生的字典 但是返回value 是ValidationError,不能直接序列化,  通过json属性cls转换是ValidationError为字典返回。优点:前端jquery不需要JSON.parse转换两次。 2)通过errors.as_json()实现数据绑定和返回。as_json返回的是字符串。
前端返回:需要两次JSON.parse转换(第一次:HttpResponse返回的是字符串;第二次:
  返回的error字典中的value是字符串,需要在转成字典,才可以访问) 示例1:注册信息
#两种方式1:as_data(注意view中绑定方式和模板中jqeury调用方式)
froms.py
class RegisterForm(forms.Form):
username = fields.CharField(
error_messages={"required": "用户名不能为空"},
widget=widgets.Input(attrs={"class": "form-control"})
)
email = fields.EmailField(
error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'},
widget=widgets.Input(attrs={"class": "form-control"})
)
password = fields.CharField(
error_messages={"required": "密码不能为空"},
widget=widgets.Input(attrs={"class": "form-control"})
)
password2 = fields.CharField(error_messages={"required": "密码不能为空"},
widget=widgets.Input(attrs={"class": "form-control"}))
check_code = fields.CharField(error_messages={"required": "验证码不能为空"},
widget=widgets.Input(attrs={"class": "form-control"})) def clean_username(self):
"""
验证用户存不存在
:return:
"""
obj = models.UserInfo.objects.filter(username=self.cleaned_data['username'])
# 用户存在返回原来的值
if not obj:
return self.cleaned_data['username']
else:
raise ValidationError(message="用户已存在,请更换其他用户名", code="xxxx") #views.py
from django.core.exceptions import ValidationError
class JsonCunstomEncode(json.JSONEncoder):
def default(self, field):
if isinstance(field,ValidationError):
return {"code":field.code,"message":field.message}
else:
return json.JSONEncoder.default(self,field) def register(request):
"""
注册
:param request:
:return:
"""
ret={"status":False,"error":None,"data":None}
if request.method=="GET":
register_obj=forms.RegisterForm()
return render(request, 'register.html',{"register_obj":register_obj})
elif request.method=="POST":
register_obj=forms.RegisterForm(request.POST)
if register_obj.is_valid():
ret["status"]=True
ret["data"]=register_obj.cleaned_data
else:
ret["error"]=register_obj.errors.as_data()
result=json.dumps(ret,cls=JsonCunstomEncode)
#不能使用render,使用render返回数据,前端var data1=JSON.parse(arg)转换报错。可以使用HttpResponse直接返回数据
#return render(request, 'register.html',{"result":result})
return HttpResponse(result)
模块实现:
<div class="register">
<div style="font-size: 25px; font-weight: bold;text-align: center;">
用户注册
</div>
<form role="form" id="register_form">
{% csrf_token %}
<div class="form-group">
<label for="username">用户名</label>
<input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username">
<p id="error_username"></p>
</div>
<div class="form-group">
<label for="email">邮箱</label>
<input type="email" class="form-control" id="email" placeholder="请输入邮箱" name="email">
<p id="error_email"></p>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" class="form-control" id="password" placeholder="请输入密码" name="password">
<p id="error_password"></p>
</div>
<div class="form-group">
<label for="confirm_password">确认密码</label>
<input type="password" class="form-control" id="password" placeholder="请输入密码" name="password2">
<p id="error_password2"></p>
</div> <div class="form-group">
<label for="password">验证码</label> <div class="row">
<div class="col-xs-7">
<input type="password" class="form-control" id="password" placeholder="请输入验证码" name="check_code">
<p id="error_check_code"></p>
</div>
<div class="col-xs-5">
<img src="/check_code.html">
</div>
</div>
<p id="show_error"></p>
</div>
<a id="register_a" type="submit" class="btn btn-default" >下一步</a>
</form>
<script src="/static/js/jquery-1.12.4.js"></script>
<script src="/static/js/jquery.cookie.js"></script>
<script>
$("#register_a").click(
function(){
$.ajax({
url:'{% url "register" %}',
type:"POST",
//headers: {"X-CSRFtoken":$.cookie("csrftoken")},如果是用serialize,他就csrftoken一起发送过去,所以不需要加headers
data:$("#register_form").serialize(),
success:function(arg){
var data1=JSON.parse(arg);
console.log(data1);
//#如果返回的状态为false,输出出错的内容
if (!data1.status){
//清空所有error p标签的内容
$("#register_form").find('p[id*=error_]').each(
function(){
$(this).text("")
}
)
//根据错误信息动态绑定到p标签
for (var item in data1.error){
var tmp='#error_'+item+''
$(tmp).text(data1.error[item][0].message);
}
/*
手动绑定标签,但是会存在error中没有的信息报错
$("#error_username").text(data1.error["username"][0].message);
$("#error_email").text(data1.error.email[0].message);
$("#error_password").text(data1.error.password[0].message);
$("#error_password2").text(data1.error.password2[0].message);
$("#error_check_code").text(data1.error.check_code[0].message);
*/
}
else{
//跳转到后台
location.href='{% url "base_info" %}'
}
} })
}
)
</script> 方式2:as_json views.py
def register(request):
"""
注册
:param request:
:return:
"""
ret={"status":False,"error":None,"data":None}
if request.method=="GET":
register_obj=forms.RegisterForm()
return render(request, 'register.html',{"register_obj":register_obj})
elif request.method=="POST":
register_obj=forms.RegisterForm(request.POST)
if register_obj.is_valid():
ret["status"]=True
ret["data"]=register_obj.cleaned_data
else:
ret["error"]=register_obj.errors.as_json()
result=json.dumps(ret)
#不能使用render,使用render返回数据,前端var data1=JSON.parse(arg)转换报错。可以使用HttpResponse直接返回数据
#return render(request, 'register.html',{"result":result})
return HttpResponse(result)
模板: <div class="register">
<div style="font-size: 25px; font-weight: bold;text-align: center;">
用户注册
</div>
<form role="form" id="register_form">
{% csrf_token %}
<div class="form-group">
<label for="username">用户名</label>
<input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username">
<p id="error_username"></p>
</div>
<div class="form-group">
<label for="email">邮箱</label>
<input type="email" class="form-control" id="email" placeholder="请输入邮箱" name="email">
<p id="error_email"></p>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" class="form-control" id="password" placeholder="请输入密码" name="password">
<p id="error_password"></p>
</div>
<div class="form-group">
<label for="confirm_password">确认密码</label>
<input type="password" class="form-control" id="password" placeholder="请输入密码" name="password2">
<p id="error_password2"></p>
</div> <div class="form-group">
<label for="password">验证码</label> <div class="row">
<div class="col-xs-7">
<input type="password" class="form-control" id="password" placeholder="请输入验证码" name="check_code">
<p id="error_check_code"></p>
</div>
<div class="col-xs-5">
<img src="/check_code.html">
</div>
</div>
<p id="show_error"></p>
</div>
<a id="register_a" type="submit" class="btn btn-default" >下一步</a>
</form>
<script src="/static/js/jquery-1.12.4.js"></script>
<script src="/static/js/jquery.cookie.js"></script>
<script>
$("#register_a").click(
function(){
$.ajax({
url:'{% url "register" %}',
type:"POST",
//headers: {"X-CSRFtoken":$.cookie("csrftoken")},如果是用serialize,他就csrftoken一起发送过去,所以不需要加headers
data:$("#register_form").serialize(),
success:function(arg){
//第一次转换
var data1=JSON.parse(arg);
console.log(data1);
//#如果返回的状态为false,输出出错的内容
if (!data1.status){
//清空所有error p标签的内容
$("#register_form").find('p[id*=error_]').each(
function(){
$(this).text("")
}
)
//第二次转换
var error_list=JSON.parse(data1.error)
//根据错误信息动态绑定到p标签
for (var item in error_list){
var tmp='#error_'+item+''
$(tmp).text(error_list[item][0].message);
}
/*
手动绑定标签,但是会存在error中没有的信息报错
$("#error_username").text(data1.error["username"][0].message);
$("#error_email").text(data1.error.email[0].message);
$("#error_password").text(data1.error.password[0].message);
$("#error_password2").text(data1.error.password2[0].message);
$("#error_check_code").text(data1.error.check_code[0].message);
*/
}
else{
//跳转到后台
location.href='{% url "base_info" %}'
}
} })
}
)
</script>

28)django-form+ajax实现验证的更多相关文章

  1. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

  2. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  3. django form 表单验证

  4. [oldboy-django][2深入django]Form总结

    1 form总结 # Form数据格式验证 - 原理: - 流程 a.写类LoginForm(Form): 字段名 = fields.xxFields() # 验证规则,本质是正则表达式(fields ...

  5. Django基础——Form&Ajax篇

    一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...

  6. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  7. the django travel three[form表单验证]

    一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...

  8. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  9. 九 Django框架,Form表单验证

    表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

随机推荐

  1. 数据建模工具系列 之 让SQL Power Architect支持Vertica

    几款数据建模软件评估 下面是流行几款数据建模软件: 软件 特点 支持Vertica? 免费? ERWin 功能强大, 操作较繁琐 不支持Vertica 商业软件,价格高 Power Designer ...

  2. Swiper.js使用教程

    官网地址:(http://www.swiper.com.cn/). 一.Swiper.js简介: Swiper(前称Swiper master) 是一款免费以及轻量级的移动设备触控滑块的js框架,使用 ...

  3. CentOS7清理磁盘空间

    1 首先查询磁盘空间占用情况. 发现/根目录下面磁盘占用百分之一百 df -ah 2 进入根目录,查询大文件与目录 cd /du -sh * | sort -n 查看上GB的目录并且排序,可以用这个命 ...

  4. Java基础_0307:String类的基本概念

    String类的两种实例化方式 直接赋值: String str = "www.YOOTK.com"; 构造方法: 构造方法:public String(String str),在 ...

  5. ssm mysql 新增数据返回id

    描述: 在ssm项目中,新增一条数据,返回该数据的数据库id(主键) 实现方法: 1.xml 增加  useGeneratedKeys="true" keyProperty=&qu ...

  6. python 中的"*"与"**"

    1.Python中 *和**很常见的运算符的用途及其多种使用方式. 本文所述的*和**,指的是*和**前缀运算符,而不是中缀运算符. 所以指的不是乘法和乘幂: 使用*和**将参数传递给函数 使用*和* ...

  7. react-踩坑记录——页面底部多出一倍高度的空白

    挂载slider组件后页面底部多出一倍高度的空白,如下: slider组件内容⬇️: class Slider extends Component{ constructor(){ super(); } ...

  8. cxf动态调用外部web service 报告异常java.lang.NoSuchFieldError: QUALIFIED

    原因:cxf 依赖的xmlschema-core 与xfire-all依赖的xmlschema冲突.(百度搜索亦得知:cxf 依赖的xmlschema-core 与axis2-kernel依赖的xml ...

  9. 数组转集合、集合转数组、字符串数组与int型、long型数组等的转换

    在项目中经常会遇到数组转集合.集合转数组.数组之间类型转换等操作 1.数组转集合 为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码: String str[] = { ...

  10. java知识点2

    进阶篇 Java底层知识 字节码.class文件格式 CPU缓存,L1,L2,L3和伪共享 尾递归 位运算 用位运算实现加.减.乘.除.取余 设计模式 了解23种设计模式 会使用常用设计模式 单例.策 ...