python day17
Query示例: 表单验证,jQuery扩展 1、回顾基础内容 2、dom事件绑定 3、jquery事件绑定 4、$.each return false 表示break; 5、jquery扩展方法: 两种方式: 6、自定义jQuery扩展的正确方法: a. 自执行 b. 闭包 7、jquery扩展实现基本验证 a. 支持是否允许为空 b. 长度 c. 正则表达式 定义正则表达式 reg = /正则表达式/ ***** g i m ==> 特殊 利用正则匹配 reg.test(字符串) ***** reg.exec(字符串) 全局 非全局 字符串三个方法: search match replace -- 特殊符号 滚动菜单 页面布局(absolute) 监听滚动事件: 如果滚动>60,菜单固定 如果滚动<60,菜单固定取消 Ajax(欠) 前端插件: fontawsome easyui jqueryui bootstrap -- 引入css -- 引入jQuery(2.x,1.12) -- 引入js -- bootstrap模版 bxslider jquery.lazyload ==> 以后可以用模版 验证失败报错 relative 和 absolute 合用是内容可以随意调整 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .item{ width: 250px; height: 60px; position: relative; } .item input{ width: 200px; } .item span{ position: absolute; top: 20px; left: 0px; font-size: 8px; background-color: indianred; color: white; display: inline-block; width: 200px; } </style> </head> <body> <div> <form> <div class="item"> <input class="c1" type="text" name="username" label="用户名"/> <!--<span>用户名不能为空</span>--> </div> <div class="item"> <input class="c1" type="password" name="pwd" label="密码"/> <!--<span>密码不能为空</span>--> </div> <input type="submit" value="提交" onclick="return CheckValid();" /> </form> </div> <script src="jquery-1.12.4.js"></script> <script> function CheckValid() { // 找到form标签下的所有需要验证的标签 // $('form .c1') // $('form input[type="text"],form input[type="password"]') // 循环所有需要验证的标签,获取内容 // 先清除 $('form .item span').remove(); var flag = true; // each循环 $('form .c1').each(function () { var val = $(this).val(); if(val.length<=0){ // attr获取属性 var label = $(this).attr('label'); var tag = document.createElement('span'); tag.innerText = label + "不能为空"; // after在之后加内容 $(this).after(tag); flag = false; } }); return flag; } </script> </body> </html> JQUERY验证失败报错 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .item{ width: 250px; height: 60px; position: relative; } .item input{ width: 200px; } .item span{ position: absolute; top: 20px; left: 0px; font-size: 8px; background-color: indianred; color: white; display: inline-block; width: 200px; } </style> </head> <body> <div> <form> <div class="item"> <input class="c1" type="text" name="username" label="用户名"/> <!--<span>用户名不能为空</span>--> </div> <div class="item"> <input class="c1" type="password" name="pwd" label="密码"/> <!--<span>密码不能为空</span>--> </div> <!--<input type="submit" value="提交" onclick="return CheckValid();" />--> <input type="submit" value="提交"/> </form> </div> <script src="jquery-1.12.4.js"></script> <script> $(function(){ // 当页面框架加载完成之后,自动执行 BindCheckValid(); }); function BindCheckValid(){ // $(':submit').click(function () { $('form input[type=submit]').click(function () { var flag = true; // 只要一点击submit按钮,执行此处内空,找到form标签下的所有需要验证的标签 $('form .item span').remove(); $('form .c1').each(function () { var val = $(this).val(); if(val.length<=0){ var label = $(this).attr('label'); var tag = document.createElement('span'); tag.innerText = label + "不能为空"; $(this).after(tag); flag = false; } }); return flag; }); } </script> </body> </html> JQUERY扩展 1.自执行函数 2.闭包,防多个扩展文件函数名冲突 extend1.js /** * Created by Administrator on 2016/8/28. */ // 自执行函数,参数即$,$即jQuery (function (jq) { jq.extend({ 'dalong1':function (arg) { console.log(arg); } }); function f1() { } })(jQuery); s3.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script src="jquery-1.12.4.js"></script> <script src="extend1.js"></script> <script> // 调用dalong $.dalong1('123'); </script> </body> </html> FORM验证,单文件定义限制规则 commons.js /** * Created by alex on 2016/8/28. */ // 自定义函数 (function(jq){ // 通用验证函数 function ErrorMessage(inp,message){ var tag = document.createElement('span'); tag.innerText = message; inp.after(tag); } // JQUREY扩展 jq.extend({ valid:function(form){ // #form1 $('#form1') jq(form).find(':submit').click(function(){ jq(form).find('.item span').remove(); var flag = true; jq(form).find(':text,:password').each(function(){ var require = $(this).attr('require'); if(require){ var val = $(this).val(); if(val.length<=0){ var label = $(this).attr('label'); ErrorMessage($(this),label + "不能为空"); flag = false; return false; } var minLen = $(this).attr('min-len'); if(minLen){ var minLenInt = parseInt(minLen); if(val.length<minLenInt){ var label = $(this).attr('label'); ErrorMessage($(this),label + "长度最小为"+ minLen); flag = false; return false; } //json.stringify() //JSON.parse() } var phone = $(this).attr('phone'); if(phone){ // 用户输入内容是否是手机格式 var phoneReg = /^1[3|5|8]\d{9}$/; if(!phoneReg.test(val)){ var label = $(this).attr('label'); ErrorMessage($(this),label + "格式错误"); flag = false; return false; } } // 1、html自定义标签属性 // 增加验证规则+错误提示 } // 每一个元素执行次匿名函数 // this //console.log(this,$(this)); /* var val = $(this).val(); if(val.length<=0){ var label = $(this).attr('label'); var tag = document.createElement('span'); tag.innerText = label + "不能为空"; $(this).after(tag); flag = false; return false; } */ }); return flag; }); } }); })(jQuery); 4.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .item{ width: 250px; height: 60px; position: relative; } .item input{ width: 200px; } .item span{ position: absolute; top: 20px; left: 0px; font-size: 8px; background-color: indianred; color: white; display: inline-block; width: 200px; } </style> </head> <body> <div> <form id="form1"> <div class="item"> <input class="c1" type="text" name="username" label="用户名" require="true" min-len="6"/> </div> <div class="item"> <input class="c1" type="password" name="pwd" label="密码"/> </div> <div class="item"> <input class="c1" type="text" name="phone" label="手机" require="true" phone="true"/> </div> <input type="submit" value="提交" /> </form> </div> <script src="jquery-1.12.4.js"></script> <script src="commons.js"></script> <script> $(function(){ // 传form1给commons的function $.valid('#form1'); }); </script> </body> </html> 正则表达式 http://www.cnblogs.com/wupeiqi/articles/5433893.html Web框架 请求周期 处理用户请求 放置HTML模版 操作数据库 Controllers Views Modals Views Template Modals MVC/MTV Django => MTV Django 1.安装 pip3 install Django==1.10 或 pip3 install Django 2.创建project django-admin.py startproject mysite 目录结构 mysite mysite - settings.py # 配置文件 - urls.py # 路由系统(调度) - wsgi.py # WSGI managel.py # django程序启动文件 3.创建APP 所有APP共享project cd mysite python3 manage.py startapp cmdb cmdb __init__.py admin.py # WEB后台管理 apps.py # 当前app配置文件 models.py # 数据库管理,自动创建数据结构 tests.py # 单元测试,测试你的某个功能 views.py # 业务请求处理 4.编写代码 urls.py views.py (1) 配置路由关系 urls.py urls.py from cmdb import views #导入views模块 urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^index/', views.index), # 配置映射关系,逗号前是url,逗号后为交给某一函数(view模块的index函数) ] (2) 配置业务请求处理 views.py views.py 创建对应自己的函数 cmdb 的 views 处理用户请求,必须为函数 from django.shortcuts import HttpResponse # 导入处理模块 # Create your views here. # 处理用户请求 def index(request): # 处理函数,用户请求放入request中 return HttpResponse('123') # 处理字符串,必须放在HttpResponse才能识别 5.启动Django程序 python3 manage.py runserver 8000 python manage.py runserver #测试 启动web服务器,只允许本地访问 python manage.py runserver 0.0.0.0:8080 #允许所有 6.访问 http://127.0.0.1:8000/index/ 7.使用模板 settings配置 指定Template目录,告诉django配置文件在那里 render传递数据给html (request,'路径') (1) Template # 放置HTML模版,可新建 index.html # 手动创建 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1 style="color: red">123</h1> </body> </html> (2) views #配置业务请求处理,指定html文件,在cmdb目录下 from django.shortcuts import render def index(request): # return HttpResponse('123') return render(request,'index.html') #使用render方法指定html (3) 启动并访问 python manage.py runserver 0.0.0.0:8080 http://127.0.0.1:8000/index/ 8. 静态文件配置 (1) statics # 手动创建,在mysite主目录创建 jquery-1.8.2.min.js # 存入jquery文件 (2) index.html 指定statics <script src="/statics/jquery-1.8.2.min.js"></script> (3) settings 指定statics,在文件最后添加 (1) 指定静态文件目录 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'statics'), ) (2) 指定HTML引用静态文件的前缀,可选项,非必选 STATIC_URL = '/fff/' #指定前缀为fff (4) index.html 引用前缀 <script src="/fff/jquery-1.8.2.min.js"></script> (5) 访问 F12 --- Elements----/fff/jquery-1.1.8.2.min.js----右键---open link in new tab打开成功即可 9.表单操作及页面展示(内存版) (1)表单页面 <body> <h1>用户输入:</h1> {#以POST方式提交#} <form action="/index/" method="POST"> <input type="text" name="user"/> <input type="test" name="email"/> <input type="submit" value="提交"/> </form> </body> (2)views处理 # 判断用户是否是POST请求 from django.shortcuts import render from django.shortcuts import HttpResponse # Create your views here. def index(request): # return HttpResponse('123') # 判断 if (request.method == 'POST'): user = request.POST.get('user', None) email = request.POST.get('email', None) print(user, email) return render(request,'index.html') 直接访问会提交会报错,是DJANGO提供的跨站请求伪造,可以通过settings修改处理 Forbidden (403) CSRF verification failed. Request aborted. (3)settings修改 MIDDLEWARE 或 MIDDLEWARE-CLASSES 列表注释掉 django.middleware.csrf.CsrfViewMiddleware 这一行 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] (4)页面提交 提交内容为 123 123 后台接收到数据 123 123 [31/Aug/2016 23:13:28] "POST /index/ HTTP/1.1" 200 339 (5)数据展示 (1)views 处理数据 from django.shortcuts import render from django.shortcuts import HttpResponse # 1. 处理用户请求 u1和e1为两列,u1和u2为两行 USER_INPUT = [ {'user':'u1', 'email': 'e1'}, {'user':'u2', 'email': 'e2'}, ] def index(request): # ... # 判断用户是否是POST请求 if(request.method == 'POST'): user = request.POST.get('user',None) email = request.POST.get('email',None) temp = {'user': user, 'email': email} USER_INPUT.append(temp) # 2. 追加到列表 # request.POST.get('pwd',None) # return HttpResponse('123') # 模版引擎 # 获取index.html模版 + {'data': USER_INPUT } ==》 渲染 # 字符串 #传递给HTML return render(request, 'index.html', {'data': USER_INPUT }) # 3. 传递给HTML使用data指定USER_INPUT列表 (2)HTML 编写代码,按django方式对数据进行for循环生成列表(取的是views里的data和USER_INPUT数据) django的for循环必须有开始有结束{% for item in data %}, {% endfor %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>用户输入:</h1> {#以POST方式提交#} <form action="/index/" method="POST"> <input type="text" name="user"/> <input type="test" name="email"/> <input type="submit" value="提交"/> </form> <h1>数据展示:</h1> <table border="1"> {% for item in data %} {# tr为行,td为列#} <tr> <td>{{ item.user }}</td> <td>{{ item.email }}</td> </tr> {% endfor %} </table> <script src="/fff/jquery-1.8.2.min.js"></script> </body> </html> 页面初始列表样式 ---- |u1|e1| |---| |u2|e2| ---- (3)提交数据到内存,输入内容后提交后在表格显示 http://127.0.0.1:8000/index/ 10.连接数据库 默认使用sqlite数据库 ORM 数据结构管理 models.py settings (1)models.py #配置数据库,创建类,生成数据库UserInfo表,指定字符长度 class UserInfo(models.Model): user = models.CharField(max_length=32) email = models.CharField(max_length=32) (2)注册app: settings.py # 指定APP名字 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'cmdb', ] (3)执行命令,创建库和表 python3 manage.py makemigrations python3 manage.py migrate 两条命令完自动创建UserInfo表 返回结果: makemigrations返回结果 Migrations for 'cmdb': cmdb\migrations\0001_initial.py: - Create model UserInfo migrate返回结果 Applying cmdb.0001_initial... OK Applying sessions.0001_initial... OK 11.操作数据库 创建: models.类.objects.create(user=u,email=e) models.UserInfo.objects.create(user=u,email=e) models.UserInfo.objects.create(user=u,email=e) models.UserInfo.objects.create(user=u,email=e) 获取: models.类.objects.all() models.UserInfo.objects.all() (1)views 处理 from django.shortcuts import render from django.shortcuts import HttpResponse from django.shortcuts import redirect from cmdb import models # 1.导入models数据库模块 # 处理用户请求 def index(request): # ... # 判断用户是否是POST请求 # return redirect('http://baidu.com') # return redirect('') if(request.method == 'POST'): u = request.POST.get('user',None) e = request.POST.get('email',None) models.UserInfo.objects.create(user=u,email=e) # 2. Post提交数据,使数据库出现内容 # request.POST.get('pwd',None) # return HttpResponse('123') # 模版引擎 # 获取index.html模版 + {'data': USER_INPUT } ==》 渲染 # 字符串 data_list = models.UserInfo.objects.all() # 3. 取UserInfo表数据,get取数据,对于ORM每一行数据都是它的对像 # [UserInfo对象,UserInfo对象,。。。] 每一行数据里都是一个对像 # for item in data_list: # print(item.user,item.email) #传递给HTML return render(request, 'index.html', {'data': data_list }) # 4. 传递给HTML使用data_list指定USER_INPUT列表 (2)HTML文件 index.html 循环data_list,取每一行对像数据 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>用户输入:</h1> <form action="/index/" method="POST"> <input type="text" name="user" /> <input type="text" name="email" /> <input type="submit" value="提交" /> </form> <h1>数据展示:</h1> <table border="1"> <tr> <th>用户名</th> <th>邮箱</th> </tr> {% for line in data %} <tr> <td>{{ line.user }}</td> <td>{{ line.email }}</td> </tr> {% endfor %} </table> <script src="/fff/jquery-1.8.2.min.js"></script> </body> </html> (3)访问提交数据到库 http://127.0.0.1:8000/index/