zoukankan      html  css  js  c++  java
  • django学习第86天Django的Ajax文件上传.分页器.forms组件

    一.ajax上传

        - ajax的文件上传
            file对象=$("#myfile")[0].files[0]
            var formdata=new FormData()
            formdata.append(key,value)
            formdata.append(file,file对象)
            -$.ajax({
                url:路径,
                type:'post',
                processData:false,
                contentType:false,
                data:formdata,
                //dataType:'json',
                success:function(data){
        
                }
            }
            )
            
        -编码格式:urlencode,form-data,json

    模板cript:

      $("#filebtn").click(function () {
            //js取到文件
            var myfile = $("#id_myfile")[0].files[0]
            //生成一个FormData对象
            var formdata = new FormData()
            //放值
            formdata.append('name', $("#id_name").val())
            //formdata.append('pwd', $("#id_name").val())
            //放文件
            formdata.append('myfile', myfile)
            //formdata.append('myfile2', myfile2)
            $.ajax({
                url: '/fileupload/',
                type: 'post',
                //这两个要必须写
                processData:false,  //不预处理数据  因为FormData 已经做了
                contentType:false,  //我不指定编码了 因为FormData 已经做了
    
                data: formdata,
                success: function (data) {
                    console.log(data)
                }
            })
    
    
        })

    后端:

    def fileupload(request):
        print(request.POST.get('name'))
        # 文件对象
        myfile = request.FILES.get('myfile')
        with open(myfile.name, 'wb') as f:
            for line in myfile:
                f.write(line)
    
        return HttpResponse('上传成功')

    二.分页器

    分页器:
            -views.py中你需要掌握的
                -from django.core.paginator import Paginator
                -生成一个paginator=Paginator(queryset对象,每页有多少数据)
                -paginator.cout:数据总条数   paginator.num_pages:总页码数   paginator.page_range:总页码列表
                -Page对象:page=paginator.page(页码数)
                -page 是否有上一页,是否有下一页,下一页页码数,上一页页码数
                
                -升级版本:
                    -总页码数是否大于11:
                        -当前页码-5<=1:page_range=range(1,12)
                        -当前页码+5>=总页码数:page_range=range(总页码数-10,总页码数+1)
                        -其它情况(生成左5右5):page_range=range(当前页码-5,当前页码+6)
                    -总页码小于等于11:
                        page_range=paginator.page_range
                        
            -模板层:
                -上一页,下一页的判断
                -for循环总页码列表(page_range)

    模板script

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
        <title>Title</title>
    </head>
    <body>
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <table class="table">
                <thead>
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                </tr>
                </thead>
                <tbody>
                {% for user in  page %}
                    <tr>
                        <td>{{ forloop.counter }}</td>
                        <td>{{ user.name }}</td>
                        <td>{{ user.age }}</td>
                    </tr>
    
                {% endfor %}
    
                </tbody>
            </table>
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    {% if page.has_previous %}
                        <li>
                            <a href="/pagetest/?page={{ page.previous_page_number }}" aria-label="Previous">
                                <span aria-hidden="true">上一页</span>
                            </a>
                        </li>
                    {% else %}
                        <li class="disabled">
                            <a href="#" aria-label="Previous">
                                <span aria-hidden="true">上一页</span>
                            </a>
                        </li>
                    {% endif %}
                    {% for foo in page_range %}
                        {# 判断当前页面是否是循环到的页码,如果是,加active#}
                        {% if currentpage == foo %}
                            <li class="active"><a href="/pagetest/?page={{ foo }}">{{ foo }}</a></li>
                        {% else %}
                            <li><a href="/pagetest/?page={{ foo }}">{{ foo }}</a></li>
                        {% endif %}
    
                    {% endfor %}
    
    
                    {% if page.has_next %}
                        <li>
                            <a href="/pagetest/?page={{ page.next_page_number }}" aria-label="Next">
                                <span aria-hidden="true">下一页</span>
                            </a>
                        </li>
                    {% else %}
                        <li class="disabled">
                            <a href="" aria-label="Next">
                                <span aria-hidden="true">下一页</span>
                            </a>
                        </li>
                    {% endif %}
    
                </ul>
            </nav>
        </div>
    </div>
    
    
    </body>
    </html>

    后端:

         插入数据:

    from django.core.paginator import Paginator
    # def pagetest(request):
    #     # 批量插入数据
    #     # objes:对象列表,batch_size 一次插入数据的量
    #     # ll=[]
    #     # for i in range(100):
    #     #     # models.UserInfo.objects.create()
    #     #     ll.append(models.UserInfo(name='lqz%s'%i,age=i+1))
    #     # ret=models.UserInfo.objects.bulk_create(ll,20)
    #
    #     return HttpResponse('ok')

        初级版

    # 初级版本,存在问题,如果页数过多,页面显示太多了
    # def pagetest(request):
    #     userlist = models.UserInfo.objects.all().order_by('pk')
    #     try:
    #         currentpage = int(request.GET.get('page', 1))
    #         paginator = Paginator(userlist, 3)
    #         page = paginator.page(currentpage)
    #     except Exception as e:
    #         currentpage = 1
    #
    #     return render(request, 'pagetest.html', locals())

       终极版

    def pagetest(request):
        userlist = models.UserInfo.objects.all().order_by('pk')
        paginator = Paginator(userlist, 20)
        try:
            currentpage = int(request.GET.get('page', 1))
            page = paginator.page(currentpage)
        except Exception as e:
            currentpage = 1
            page = paginator.page(currentpage)
        # 传入页码数,拿到的就是当前页对象
        page = paginator.page(currentpage)
        # 1 总页数是否大于11,当总页码数大于11
        if paginator.num_pages > 11:
            # 1.1 当前页码数是否小于6
            if currentpage <= 6:
                #1.1.1 当当前页码小于6的时候,就生成11个页码数
                page_range = range(1, 12)
            # 1.2 当当前页码+5 大于等于总页码数
            elif currentpage + 5 >= paginator.num_pages:
                # 1.2.1 往后推11个页码数
                page_range = range(paginator.num_pages - 10, paginator.num_pages + 1)
            #1.3 生成一个左5 右5的区间
            else:
                page_range = range(currentpage - 5, currentpage + 6)
        #2 总页码数不大于11 ,有多少,显示多少
        else:
            page_range = paginator.page_range
    
        return render(request, 'pagetest.html', locals())

    三.forms组件

            -Django提供的用语数据校验和模板渲染的组件
            -在项目中创建一个py文件
                -1 写一个类继承Form
                -2 在类中写属性,写的属性,就是要校验的字段
                -3 使用:生成一个你写的类的对象myform,把要校验的数据(字典),传到对象中:MyForm(字典)
                    -数据多?数据少?数据多可以,少不行(required控制)
                -4 myform.is_valid() 是True表示所有字段都通过校验
                -5 myform.cleaned_data:是一个字典,所有通过校验的数据放在里面
                -6 myform.errors:是一个字典,所有的错误字段的信息
            -在模板中:
                -{{myform.name}}
                -{%for item in myform%}
                    {{item.label}}:{{item}}
                 {%endfor%}
                -myform.as_table/as_p/as_ul(不推荐使用)

    模板层三种渲染方式

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post" novalidate>
        <p>用户名: <input type="text" name="name"></p>
        <p>密码: <input type="password" name="pwd"></p>
        <p>邮箱: <input type="email" name="email"></p>
        <input type="submit" value="提交">
    </form>
    <hr>
    <h1>forms的模板渲染之一(推荐)</h1>
    <form action="" method="post" novalidate>
        <p>用户名: {{ myform.name }}</p>
        <p>密码: {{ myform.pwd }}</p>
        <p>邮箱: {{ myform.email }}</p>
        <input type="submit" value="提交">
    </form>
    <h1>forms的模板渲染之二(推荐)</h1>
    <form action="" method="post" novalidate>
        {% for item in myform %}
            <p>{{ item.label }}:{{ item }}</p>
        {% endfor %}
    
        <input type="submit" value="提交">
    </form>
    <h1>forms的模板渲染之三</h1>
    <form action="" method="post" novalidate>
    {#    <table>#}
    {#            {{ myform.as_table }}#}
    {#    </table>#}
    
        {{ myform.as_p }}
        <input type="submit" value="提交">
    </form>
    
    </body>
    </html>

      后端:

     

    from django import forms
    # 继承Form这个类
    class MyForm(forms.Form):
        # 限制name这个字段最长为8,最短为3
        name=forms.CharField(min_length=3,max_length=8,label='用户名',required=True,error_messages={'min_length':'至少为3',
    'max_length':'最长为8,您太长了'}) pwd=forms.CharField(min_length=3,max_length=8,label='密码',error_messages={'min_length':'至少为3','max_length':'最长为8,
    您太长了
    '}) email=forms.EmailField(label='邮箱',error_messages={'invalid':'邮箱格式不合法','required':'这个字段必填'})
    def register(request):
        if request.method=='GET':
            # 生成一个空的form对象
            myform=MyForm()
            return render(request,'register.html',locals())
        else:
            # 生成对象,传参,传字典,要校验数据的字典
            # myform=MyForm(request.POST)
            # 自己写要校验的字典,数据多了,多的是不校验的,但是cleaned_data中也没有多出来的数据
            # dic={'name':'lqz','pwd':'123','email':'22@qq.com','xx':'xxx'}
            # dic={'name':'lqz','pwd':'123','email':'22'}
            dic={'name':'lqzfgsdfgsdf','pwd':'1','email':'5555'}
            myform = MyForm(dic)
            # 所有字典都校验通过,它就是True的
            if myform.is_valid():
                # 取出校验通过的数据
                clean_data=myform.cleaned_data
                print(clean_data)
                # models.UserInfo.objects.create(**clean_data)
            else:
                # 所有的错误信息
                # 只要是校验通过的值,都在cleaned_data中放着
                print(myform.cleaned_data)
                print(myform.errors.as_data())
                # 字典类型
                print(type(myform.errors))
                print(myform.errors.get('name'))
                from  django.forms.utils import ErrorDict
        return HttpResponse('ok')
  • 相关阅读:
    Linux tcpdump命令详解
    移动开发网站收集
    Struts+2权威指南基于WebWork核心的MVC开发源码下载
    Eclipse+php插件+Xdebug搭建PHP完美开发/调试环境指南
    java相对目录和绝对目录解析
    python学习网站搜集
    window下开发iphone程序环境搭建iphone tool chain
    Windows下编译objectiveC
    java class路径获取
    完全优化MySQL数据库性能的八个方法
  • 原文地址:https://www.cnblogs.com/ye-hui/p/10290604.html
Copyright © 2011-2022 走看看