formdata重点:

  1. 实例化FormData这个类
  2. 循环serializeArray可以节省代码量
  3. 图片要用$('#id')[0].files[0]来获得
  4. 加上contentType:false和processData:false

错误信息展示重点:

  1. input框的id是id_field,可以通过循环错误信息获取错误信息的字段field,然后通过id_filed展示错误信息
  2. 展示错误信息前先把错误信息清空了

 全局钩子重点:

可在前端通过__all__获取全局错误信息并展示出来

html

<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form id="fm">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<span class="error-info pull-right"></span>
</div>
{% endfor %} <div class="form-group">
<label for="id_avatar">头像
<img width="60" height="60" id="avatar_img" src="/static/blog/img/default_avatar.jpg">
</label> <input type="file" name="avatar" id="id_avatar" class="hidden">
</div> <input type="button" id="reg_btn" class="btn btn-info" value="提交">
</form>
</div>
</div>
</div>

js

    // 头像预览功能
$('#id_avatar').change(function () { // 图片发生了变化,所以要用change事件
// 获取用户选中的文件对象
let file_obj = $(this)[0].files[0]; // 获取文件对象的路径
let reader = new FileReader(); // 等同于在python里拿到了实例对象
reader.readAsDataURL(file_obj); reader.onload = function () {
// 修改img的src属性,src = 文件对象的路径
$("#avatar_img").attr('src', reader.result); // 这个是异步,速度比reader读取路径要快,
// 所以要等reader加载完后在执行。
};
}); // 基于Ajax提交数据
$('#reg_btn').click(function () {
let formdata = new FormData(); // 相当于python里实例化一个对象
let request_data = $('#fm').serializeArray();
$.each(request_data, function (index, data) {
formdata.append(data.name, data.value)
});
formdata.append('avatar', $('#id_avatar')[0].files[0]); $.ajax({
url: '',
type: 'post',
contentType: false,
processData: false,
data: formdata,
success: function (data) {
if (data.user) {
// 注册成功
location.href = '{% url "blog:login" %}'
} else {
// 注册失败 // 清空错误信息,每次展示错误信息前,先把之前的清空了。
$('span.error-info').html("");
$('.form-group').removeClass('has-error');
// 展示此次提交的错误信息
$.each(data.msg, function (field, error_list) {
if (field === '__all__') { // 全局错误信息,在全局钩子里自己定义的
$('#id_re_pwd').next().html(error_list[0]);
}
$('#id_' + field).next().html(error_list[0]);
$('#id_' + field).parent().addClass('has-error'); // has-error是bootstrap提供的
});
}
}
})
})

regForm.py

"""
用户注册验证
"""
from django import forms
from django.forms import widgets, ValidationError from blog.models import UserInfo class RegForm(forms.Form):
user = forms.CharField(
max_length=32,
min_length=6,
error_messages={
'required': '用户名不能为空',
'max_length': '用户名长度不能超过32个',
'min_length': '用户名长度不能少于6个',
},
label='用户名',
widget=widgets.TextInput(
attrs={'class': 'form-control'}
)
)
pwd = forms.CharField(
max_length=32,
min_length=6,
error_messages={
'required': '密码不能为空',
'max_length': '密码长度不能超过32个',
'min_length': '密码长度不能少于6个',
},
label='密码',
widget=widgets.PasswordInput(
attrs={'class': 'form-control'}
)
)
re_pwd = forms.CharField(
max_length=32,
min_length=6,
error_messages={
'required': '确认密码不能为空',
'max_length': '密码长度不能超过32个',
'min_length': '密码长度不能少于6个',
},
label='确认密码',
widget=widgets.PasswordInput(
attrs={'class': 'form-control'}
)
)
email = forms.EmailField(
max_length=32,
error_messages={
'required': '用户名不能为空',
'invalid': '请输入正确的邮箱格式',
},
label='邮箱',
widget=widgets.EmailInput(
attrs={'class': 'form-control'}
)
) def clean_user(self):
username = self.cleaned_data.get('user') user = UserInfo.objects.filter(username=username).first() if not user:
return username
else:
raise ValidationError('该用户已注册') def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd') if pwd and re_pwd:
if pwd == re_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致')

views.py

from django.contrib import auth
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse from blog.utils.slide_auth_code import pcgetcaptcha
from blog.forms.regForm import RegForm def register(request):
if request.is_ajax():
print(request.POST)
form = RegForm(request.POST)
response = {'user': None, 'msg': None}
if form.is_valid():
response['user'] = form.cleaned_data.get('user')
else:
print(form.cleaned_data)
print(form.errors)
response['msg'] = form.errors return JsonResponse(response) form = RegForm() context = {
'form': form
}
return render(request, 'register.html', context=context)

基于Ajax提交formdata数据、错误信息展示和局部钩子、全局钩子的校验。的更多相关文章

  1. 基于ajax提交数据

    昨日回顾: 1 inclusion_tag -干什么用的?生成html的片段(动态,传参数,传数据) -app下新建一个模块,templatetags -创建一个py文件(mytag.py) -fro ...

  2. Extjs 表单验证后,几种错误信息展示方式

    今天要求对form表单验证,进行系统学习一下,故做了几个示例: Ext.onReady(function(){        var panel=Ext.create('Ext.form.Panel' ...

  3. Jquery Ajax 提交json数据

    在MVC控制器(这里是TestController)下有一个CreateOrder的Action方法 [HttpPost] public ActionResult CreateOrder(List&l ...

  4. 继上篇-jquery ajax提交 本篇用ajax提交的数据去数据库查询

    上篇讲到如何用jquery ajax提交数据至后台,后台接收并返回给ajax.https://www.cnblogs.com/tiezhuxiong/p/11943328.html 今天我们把数据传到 ...

  5. ajax提交json数据到后端C#解析

    本文链接:https://blog.csdn.net/qq_22103321/article/details/78015920 前端提交json数据 $.ajax({ type: "post ...

  6. Ajax调用处理页面错误信息500的解决思路

    最近在做项目的时候遇到一个问题:(李昌辉) 在本地服务器上做好之后,部署到阿里云虚拟主机,结果访问页面出现问题,由于登录使用的是AJAX调用处理页面,所以在点击登录的时候没有任何反应. 打开F12调试 ...

  7. 使用jquery提交FormData数据

    https://blog.csdn.net/u011500781/article/details/54931716 http://yunzhu.iteye.com/blog/2177923 ***** ...

  8. jquery ajax 提交 FormData

    $('form').submit(function(){ var formdata=new FormData(this); $.ajax({ type:'POST', url:'/url/path', ...

  9. jQuery.ajax提交JSON数据

    $.ajax({ type: 'POST', url: "URL", contentType:'application/json', //需要加contentType crossD ...

随机推荐

  1. centos6安装lnmp

    CentOS 6 默认仓库不包含nginx,我们可以手动添加nginx的仓库. 访问nginx官网获取repo文件 我们需要先访问nginx的官方网站,获取官方的仓库地址.点击这里访问nginx官方文 ...

  2. MongoDB 3.2 在CentOS 上的安装和配置

    MongoDB 3.2 在CentOS 上的安装和配置   2016-01-06 14:41:41 发布 您的评价:       0.0   收藏     0收藏 一.安装 编辑/etc/yum.re ...

  3. 学习笔记:location.hash和history.pushState()

    在浏览器中改变地址栏url,将会触发页面资源的重新加载,这使得我们可以在不同的页面间进行跳转,得以浏览不同的内容.但随着单页应用的增多,越来越多的网站采用ajax来加载资源.因为异步加载的特性,地址栏 ...

  4. spring mvc 的理解

    1.Spring MVC是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基 ...

  5. MongoDB-2.6.0 (OpenLogic CentOS7.2)

    平台: CentOS 类型: 虚拟机镜像 软件包: mongodb basic software database linux open source 服务优惠价: 按服务商许可协议 云服务器费用:查 ...

  6. SQL优化 · 经典案例 · 索引篇

    Introduction 在这些年的工作之中,由于SQL问题导致的数据库故障层出不穷,下面将过去六年工作中遇到的SQL问题总结归类,还原问题原貌,给出分析问题思路和解决问题的方法,帮助用户在使用数据库 ...

  7. ASP.NET Dev ASPxGridView控件使用 ASP.NET水晶报表打印

    1.ASPxGridView控件使用 2.ASP.NET水晶报表客户端打印 3.javascript打印 4.ASPxGridView根据Textbox查询 5. ASPxGridView 列宽 1. ...

  8. JS整数验证

    整数验证 方法1 function ValidatInteger(obj) { var reg = /^[1-9]\d*$/ if (!reg.test($(obj).val())) { $(obj) ...

  9. 项目移动后报error LNK1123

    VS20101.解决方案窗口 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”:2.项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “是”改为“否”:3.对于64位的操 ...

  10. yii2 详细分解实现分页效果

    1.首先,准备一个数据表,内容为: 然后建立一个控制器,比如我的例子中的是:PractiseController.php 接着,我们开始在控制器中输入内容: 从中我们可以看到,这是将表数据中,id为2 ...