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')
原文地址:https://www.cnblogs.com/ye-hui/p/10290604.html