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. CXF 发布rest服务

    1.1      什么是rest服务 REST 是一种软件架构模式,只是一种风格,rest服务采用HTTP 做传输协议,REST 对于HTTP 的利用实现精确的资源定位. Rest要求对资源定位更加准 ...

  2. pat1059. Prime Factors (25)

    1059. Prime Factors (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HE, Qinming Given ...

  3. 《C#高效编程》读书笔记03-推荐使用is或as操作符而不是强制类型转换

    在日常编码中,很多时候都要编写接受object作为参数的方法,接下来是将这些object转型成特定类型,要么类,要么接口.这时我们有两种选择,使用as操作符,或者使用强制类型转换. 正确的做法是,尽可 ...

  4. JavaSE_5_线程

    1.多线程中的i++线程安全吗?为什么? 不安全,因为每个线程都有自己的工作内存,每个线程需要对共享变量操作时必须把共享变量从主内存中加载到自己的工作内存,等完成操作后再保存到内存中,如果一个线程运算 ...

  5. Java的HashMap和HashTable(转)

    来源:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html 1. HashMap 1)  hashmap的数据结构 Has ...

  6. Django--对表的操作

    一丶多表创建 1.创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之 ...

  7. vue实现选中列表功能

    <template> <div> <ul v-for="prop in items"> <dt>{{prop.name}}</ ...

  8. js为页面元素添加水印

    近期有需求为页面部分区域添加上水印,通过在网上找到了js为页面添加水印的方法,后来经过自己的改进,可以实现为页面部分元素添加水印,最终效果如下图: 代码如下: function watermark(s ...

  9. intelij idea相关笔记--持续更新

    一.快捷键: Ctrl+F 文件内查找 Ctrl+Shift+F 全局查找 Ctrl+Shift+N 查找文件 Ctrl+Alt+← 返回上一步 Ctrl+Alt+→ 返回下一步 二.编译相关: 如果 ...

  10. 中标麒麟高级服务器操作系统V6

    平台: linux 类型: 虚拟机镜像 软件包: java-1.6.0 mysql-5.1.5 python-2.6 qt3-3.3.8b basic software linux neokylin ...