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{
             250px;
            height: 60px;
            position: relative;
        }
        .item input{
             200px;
        }
        .item span{
            position: absolute;
            top: 20px;
            left: 0px;
            font-size: 8px;
            background-color: indianred;
            color: white;
            display: inline-block;
             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{
             250px;
            height: 60px;
            position: relative;
        }
        .item input{
             200px;
        }
        .item span{
            position: absolute;
            top: 20px;
            left: 0px;
            font-size: 8px;
            background-color: indianred;
            color: white;
            display: inline-block;
             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{
                 250px;
                height: 60px;
                position: relative;
            }
            .item input{
                 200px;
            }
            .item span{
                position: absolute;
                top: 20px;
                left: 0px;
                font-size: 8px;
                background-color: indianred;
                color: white;
                display: inline-block;
                 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':
                    cmdbmigrations001_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/
        
        
        

        
        
        
        
        
原文地址:https://www.cnblogs.com/wangminghu/p/5828145.html