基于Ajax提交formdata数据、错误信息展示和局部钩子、全局钩子的校验。
formdata重点:
- 实例化FormData这个类
- 循环serializeArray可以节省代码量
- 图片要用$('#id')[0].files[0]来获得
- 加上contentType:false和processData:false
错误信息展示重点:
- input框的id是id_field,可以通过循环错误信息获取错误信息的字段field,然后通过id_filed展示错误信息
- 展示错误信息前先把错误信息清空了
全局钩子重点:
可在前端通过__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数据、错误信息展示和局部钩子、全局钩子的校验。的更多相关文章
- 基于ajax提交数据
昨日回顾: 1 inclusion_tag -干什么用的?生成html的片段(动态,传参数,传数据) -app下新建一个模块,templatetags -创建一个py文件(mytag.py) -fro ...
- Extjs 表单验证后,几种错误信息展示方式
今天要求对form表单验证,进行系统学习一下,故做了几个示例: Ext.onReady(function(){ var panel=Ext.create('Ext.form.Panel' ...
- Jquery Ajax 提交json数据
在MVC控制器(这里是TestController)下有一个CreateOrder的Action方法 [HttpPost] public ActionResult CreateOrder(List&l ...
- 继上篇-jquery ajax提交 本篇用ajax提交的数据去数据库查询
上篇讲到如何用jquery ajax提交数据至后台,后台接收并返回给ajax.https://www.cnblogs.com/tiezhuxiong/p/11943328.html 今天我们把数据传到 ...
- ajax提交json数据到后端C#解析
本文链接:https://blog.csdn.net/qq_22103321/article/details/78015920 前端提交json数据 $.ajax({ type: "post ...
- Ajax调用处理页面错误信息500的解决思路
最近在做项目的时候遇到一个问题:(李昌辉) 在本地服务器上做好之后,部署到阿里云虚拟主机,结果访问页面出现问题,由于登录使用的是AJAX调用处理页面,所以在点击登录的时候没有任何反应. 打开F12调试 ...
- 使用jquery提交FormData数据
https://blog.csdn.net/u011500781/article/details/54931716 http://yunzhu.iteye.com/blog/2177923 ***** ...
- jquery ajax 提交 FormData
$('form').submit(function(){ var formdata=new FormData(this); $.ajax({ type:'POST', url:'/url/path', ...
- jQuery.ajax提交JSON数据
$.ajax({ type: 'POST', url: "URL", contentType:'application/json', //需要加contentType crossD ...
随机推荐
- arch搭建SVN服务器
一.安装 Install the package Install subversion from the official repositories. Create a repository Crea ...
- drupal优化全攻略
下面是drupal优化的一些经验.分四大部分来讲. 第一部分:Drupal系统本身的设置来达到优化 第二部分:针对php代码进行的优化 第三部分:针对MYSQL数据库进行的优化 第四部分:针对网站架构 ...
- Primefaces dataTable设置滚动条问题
primefaces dataTable设置滚动条后不论有几行数据都会有滚动条的位置,当数据所占高度大于scrollHeight设定的值时才会出现滚动条,问题是,没有出现滚动条时,预留滚动条的位置不仅 ...
- web 单例 多例
单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例多例:所谓单例就是所有的请求都用一个对象来处理, ...
- ForkJoin有参无返回值、有参有返回值实例
介绍: a . Fork/Join为JKD1.7引入,适用于对大量数据进行拆分成多个小任务进行计算的框架,最后把所有小任务的结果汇总合并得到最终的结果 b . 相关类 public abstract ...
- GitHub上易于高效开发的Android开源项目TOP20--适合新手
1. android-async-http android-async-http是Android上的一个异步.基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上. 2. an ...
- hibernate课程 初探单表映射1-4 hibernate开发前准备
开发前准备: 1 eclipse 2 hibernate tools的安装(需要相关的jar包)(可以简化orm框架) hibernate tools的安装步骤: 1 到官网下载 https://so ...
- socket网络套节字---聊天室
一:服务端: 1.创建客户端: package com.ywh.serversocket; import java.io.InputStream; import java.io.OutputStrea ...
- Spring之IOC核心模块详解
Spring IOC简述 IOC称为控制反转,也有一种说法叫DI(依赖注入).IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开. 什么是控制反转呢?简单的说,控制反转就 ...
- happy2018暑期集训课后习题001
根据需求补全下面的代码: 需求: 每行输入三个整数a.b.c,根据a的值不同对b和c进行不同的操作: a为0时,计算b+c a为1时,计算b-c a为2时,计算b*c a为3时,计算b/c 并输出操作 ...