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. 【Java密码学】Java SE 6中XML数字签名的实现

    package test.xml.signature; import java.io.File; import java.io.FileInputStream; import java.io.File ...

  2. .net core mvc全局设置跨域访问

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory ...

  3. 十分钟玩转 jQuery、实例大全(参考自博主索宁)

    十分钟玩转 jQuery.实例大全(参考自博主索宁) 一.简介 书写规则 支持链式操作: 在变量前加"$"符号(var $variable = jQuery 对象): 注:此规定并 ...

  4. sass相关随笔

    安装 下载ruby并且安装 点击这里 打开命令行输入 gem install sass 我使用的是sublime text3 还需要下载三个插件 sass -- 可以帮助你语法高亮 sass buil ...

  5. PHP中XML和数组互相转换的方法

    转换代码如下 //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=&g ...

  6. sql & sqlalchemy join多个表

    # 连接两个数据表的用法: FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort # 语法格式可以概 ...

  7. 本人常用的Phpstorm快捷键

    我设置的是eclipse的按键风格(按键习惯),不是phpstorm的风格 1.添加TODO(这个不是快捷键)://TODO 后面是说明,换行写实现代码 2.选择相同单词做一次性修改:Alt+J+鼠标 ...

  8. Struct2标签的传值方式(转载)

    "#request.userList"> "center"> "id"/> : "username"/ ...

  9. 在MVC中加载view(点开链接)的方式

    主要有: Html.ActionLink Html.RenderPartial Html.RenderAction Html.Partial AJAX.ActionLink load 浏览器对象模型 ...

  10. JAVA入门2019-JAVA配置(windows7和10通用)IDE推荐和相关软件

    如何安装JDK 首先,略过"什么是JDK",非要问,这就是编译环境,JRE是运行环境.一个写程序,一个部署运行. 下载的方法:百度 java se 或者openJDK(两个差不多, ...