Django学习系列之Form表单结合ajax

时间:2022-02-11 10:27:33
 

Forms结合ajax

Forms的验证流程:

  1. 定义用户输入规则的类,字段的值必须等于html中name属性的值(pwd= forms.CharField(required=True)=<input type="password" name="pwd"/>,也就是说pwd=pwd)
  2. 把用户提交的数据交给规则的类处理
  3. 规则的类会判断用户输入的内容是否符合定义的规则
  4. 如果正确就把用户输入的内容以字典的形式存储,否则把报错信息以字典的形式存储

简单的Django-Form表单验证

定义urls.py

from django.conf.urls import url
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^login/', views.login),
]

定义views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse
import json
from django import forms #定义用户输入的规则
class LoginForm(forms.Form):
user = forms.CharField(required=True) #定义login.html中input标签中name=user的标签规则
pwd = forms.CharField(required=True) #定义login.html中input标签中name=pwd的标签规则 def login(request):
if request.method == 'POST':
obj = LoginForm(request.POST) #把login.html中用户输入的内容封装到LoginForm类交给它处理
ret = obj.is_valid() #如果提交的数据符合LoginForm中的规则,则返回True,否则返回False
if ret:
print(obj.clean()) #如果符合规则以字典的形式打印出用户提交的数据
else:
print(obj.errors) #如果不符合规则以字典的形式打印出错误
return render(request,'login.html')

定义login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div>
<div>
<input type="text" name="user"/>
</div>
<div>
<input type="password" name="pwd"/>
</div>
<input type="button" value="提交" onclick="DoSubmit();"/>
</div>
<script src="/static/jquery-1.12.4.js"></script>
<script>
var input_dict = {};
function DoSubmit() {
$("input").each(function () { #相当于for循环所有input标签
var v = $(this).val(); #获取循环到当前input标签的内容
var n = $(this).attr('name'); #获取循环到当前input标签的属性值,name=user,user就是属性值,name=pwd,pwd就是属性值
input_dict[n] = v; #生成字典:{'属性值':'标签输入的内容'},{'pwd':111}
});
console.log(input_dict);
$.ajax({
url:'/login/',
type:'POST',
data:input_dict,
success:function (data) {
console.log(data);
},
error:function () { }
})
}
</script>
</body>
</html>

ModelForm结合ajax

需求:

修改个人信息,如果有字段没填写就报错,如果字段填写没问题就保存到数据库

urls.py

url(r'^info/$',views.UserInfoView.as_view(),name='user_info'),

models.py

class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=,verbose_name='昵称',default='')
birday = models.DateField(null=True,blank=True,verbose_name='生日')
choice_gender = (
("male","男"),
("female","女"),
)
gender = models.CharField(choices=choice_gender,default='female',max_length=,verbose_name='性别')
address = models.CharField(max_length=,default='',verbose_name='地址')
mobile = models.CharField(max_length=,null=True,blank=True,verbose_name='手机号')
image = models.ImageField(upload_to='image/%Y/%m',default='image/default.png',max_length=) class Meta:
verbose_name = "用户信息"
verbose_name_plural = "用户信息" def __str__(self):
return self.username

forms.py

from users.models import *

class UserInfoForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ['nick_name','birday','gender','address','mobile']

views.py

class UserInfoView(LoginRequiredMixin,View):
def get(self,request):
return render(request,'usercenter-info.html',{})
def post(self,request):
res = dict()
userinfo = UserInfoForm(request.POST,instance=request.user)
if userinfo.is_valid():
userinfo.save()
res['status'] = 'success'
else:
res = userinfo.errors
print(json.dumps(res))
# 假如address字段信息未填写,报错信息是这样的: "address": ["这个字段是必填项"]}
return HttpResponse(json.dumps(res),content_type='application/json')

userinfo.html

<form class="perinform" id="jsEditUserForm" autocomplete="off">
<ul class="right">
<li>昵&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;称:
<input type="text" name="nick_name" id="nick_name" value="{{ request.user.nick_name }}" maxlength="">
<i class="error-tips"></i>
</li>
<li>生&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日:
<input type="text" id="birth_day" name="birday" value="{{ request.user.birday }}" readonly="readonly"/>
<i class="error-tips"></i>
</li>
<li>性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;别:
<label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="gender" value="male" {% ifequal request.user.gender 'male' %}checked{% endifequal %} >男</label>
<label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="gender" value="female" {% ifequal request.user.geder 'female' %}checked{% endifequal %}>女</label>
</li>
<li class="p_infor_city">地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;址:
<input type="text" name="address" id="address" placeholder="请输入你的地址" value="{{ request.user.address }}" maxlength="">
<i class="error-tips"></i>
</li>
<li>手&nbsp;&nbsp;机&nbsp;&nbsp;号:
<input type="text" name="mobile" id="mobile" placeholder="请输入你的手机号码" value="{{ request.user.mobile|default_if_none:'' }}" maxlength="">
</li>
<li>邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱:
<input class="borderno" type="text" name="email" readonly="readonly" value="{{ request.user.email }}"/>
<span class="green changeemai_btn">[修改]</span>
</li>
<li class="button heibtn">
<input type="button" id="jsEditUserBtn" value="保存">
</li>
</ul>
{% csrf_token %}
</form> $('#jsEditUserBtn').on('click', function(){
var _self = $(this),
$jsEditUserForm = $('#jsEditUserForm')
verify = verifySubmit(
[
{id: '#nick_name', tips: Dml.Msg.epNickName, require: true}
]
);
if(!verify){
return;
}
$.ajax({
cache: false,
type: 'post',
dataType:'json',
url:"/users/info/",
data:$jsEditUserForm.serialize(), #把form表单填写的内容序列化成json
async: true,
beforeSend:function(XMLHttpRequest){
_self.val("保存中...");
_self.attr('disabled',true);
},
success: function(data) {
if(data.nick_name){
_showValidateError($('#nick_name'), data.nick_name); #假如nick_name字段未填写报错是这样的:{"nick_name":{"这个字段是必填项"}},所以如果nick_name字段有报错就能获取到报错信息然后展示,birth_dat字段也同理,
}else if(data.birday){
_showValidateError($('#birth_day'), data.birday);
}else if(data.address){
_showValidateError($('#address'), data.address);
}else if(data.status == "failure"){
Dml.fun.showTipsDialog({
title: '保存失败',
h2: data.msg
});
}else if(data.status == "success"){
Dml.fun.showTipsDialog({
title: '保存成功',
h2: '个人信息修改成功!'
});
setTimeout(function(){window.location.href = window.location.href;},);
}
},
complete: function(XMLHttpRequest){
_self.val("保存");
_self.removeAttr("disabled");
}
});
});

效果

Django学习系列之Form表单结合ajax

Django学习系列之Form表单结合ajax的更多相关文章

  1. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  2. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  3. 关于form表单或者Ajax向后台发送数据时,数据格式的探究

    最近在做一个资产管理系统项目,其中有一个部分是客户端向服务端发送采集到的数据的,服务端是Django写的,客户端需要用rrequests模块模拟发送请求 假设发送的数据是这样的: data = {'s ...

  4. form表单的ajax验证2

    form表单的ajax验证2: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  5. laravel中form表单,ajax传值没反应

    laravel中form表单,ajax传值没反应时,可能是令牌有问题. form中添加: {{csrf_token()}} ajax中添加: data: {'page': page, '_token' ...

  6. jQuery实现form表单基于ajax无刷新提交方法详解

    本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...

  7. Django基础,Day5 - form表单投票详解

    投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...

  8. Django框架获取各种form表单数据

    Django中获取text,password 名字:<input type="text" name="name"><br><br& ...

  9. Django学习系列之Form验证

    django表单基础 django表单分类 基于django.forms.Form:所有表单类的父类 基于django.forms.ModelForm:可以和模型类绑定的Form Form验证流程 定 ...

随机推荐

  1. java 1&period;7

    http://superuser.com/questions/740064/how-to-install-java-1-7-runtime-on-macos-10-9-mavericks sudo r ...

  2. Android 添加cookie

    /** * 添加cookie * * @param url */ private void setCookie(String url) { // 获取uid String uid = UserData ...

  3. Android学习系列&lpar;20&rpar;--App数据格式之解析Json

    JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习.     恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位.     为了文 ...

  4. &lbrack;转&rsqb;用C&num;实现的条形码和二维码编码解码器

    条形码的标准: 条形码的标准有ENA条形码.UPC条形码.二五条形码.交叉二五条形码.库德巴条形码.三九条形码和128条形码等,而商品上最常使用的就是EAN商品条形码.EAN商品条形码亦称通用商品条形 ...

  5. iOS开发笔记:编译时出现的错误和解决办法

    1."std::ios_base::Init::~Init()", referenced from 出现这样的编译问题,是需要再加进libstdc++.dylib和libstdc+ ...

  6. android开发注意点

    一.Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量命名.静态成员变量命名 只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3.常量命名 只能 ...

  7. angular-file-upload封装为指令&plus;图片尺寸限制

    不了解angular-file-upload基础使用 请先参考http://blog.csdn.net/lai_xu/article/details/49535847 博客地址 下文如果有更好的建议请 ...

  8. jjava Date格式是 May 07 17&colon;44&colon;06 CST 2018,怎么插入数据库中的timestamp格式中

    首先 我来记录下错误 死在时间格式转换错误手里了 大致就是时间格式转化失败 java代码中的May 07 17:44:06 CST 2018  是这个格式转换为 数据库的 yyyy-MM-dd HH: ...

  9. js 向上、向下取整

    // 1.只保留整数部分(丢弃小数部分) parseInt(5.1234);// 5// 2.向下取整(<= 该数值的最大整数)和parseInt()一样Math.floor(5.1234);/ ...

  10. C&num;通过COM组件操作IE浏览器&lpar;一&rpar;&colon;打开浏览器跳转到指定网站

    简介Internet Explorer对象模型 1.属性 属性 类型 描述 Application Object 返回对Internet Explorer对象的引用. Busy Boolean 返回一 ...