• Django基础(四)


     

    分页器

    #views.py
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def add(request):
    
        Booklist=[]
        for i in range(100):
            book_obj=models.Book(name="book"+str(i),price=60+i*i)
            boklist.append(book_obj)
    
            models.Book.objects.bulk_create(Booklist)
            return HttpRenponse("OK")
    
    def index(request):
        book_list=models.Book.objects.all()
    
        paginator=Paginator(book_list,8)    # 8 是每页的记录数
        '''
        print(paginator.count)              # 总的数据 100
        print(paginator.num_pages)          # 总的页数 13
        print(paginator.page_range)         # 页数范围 range(1,14)
        '''
        page_range = paginator.page_range 
    
        try:
            num = int(request.GET.get("p",1))
            page = paginator.page(num) 
        except Exception as e:
            page = paginator.page(1)
        '''
        print(page.next_page_number())
        print(page.previous_page_number())
        print(page.has_next())
        print(page.has_previous())
        '''
    
        return render(request,"index.html",{"page":page,"page_range":page_range,"num":num})
    #index.html
    <html>
    <head>
        <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script>
        <link rel="stylesheet" href="/static/dist/css/bootstrap.css">
    </head>
    <style>
     
    </style>
    <body>
    <ul>
        {% for i in page %}
            <li>{{ i.name }}</li> 
        {% endfor %}
    </ul>
    
    <nav aria-label="Page navigation">
        <ul class="pagination">
            
            {% if page.has_previous %}
                <li><a href="/?p={{ page.previous_page_number }}">上一页</a></li>
            {% else %}
                <li class="disabled"><a href="#">上一页</a></li>
            {% endif %}
    
            {% for i in page_range %}
                {% if i==num %}
                    <li class="active"><a href="/?p={{ i }}">{{ i }}</a></li>
                {% else %}
                    <li><a href="/?p={{ i }}">{{ i }}</a></li>
                {% endif %}
            {% endfor %}
    
            {% if page.has_next %}
                <li><a href="/?p={{ page.next_page_number }}">下一页</a></li>
            {% else %}
                <li class="disabled"><a href="#">下一页</a></li>    
            {% endif %}    
        </ul>
    </nav>
    </body>
    </html>

    自定义分页器

    Cookie & Session

    cooike是保留在客户端(浏览器)的妇女放键值对的容器
    session是保留在服务器上的容器 {}

    #models.py
    class UserInfo(models.Model):
        name=models.CharField(max_length=32)
        pwd=models.CharField(max_length=32)
    #urls.py
    url(r'^login/',views.login)
    url(r'^index/',views.index)
    url(r'^logout/',views.log_out)
    url(r'^addBook/',views.addBook)
    #views.py
    from app01 import models
    def login(request):
        if request.method=='POST':
            username=request.POST.get('name')
            password=request.POST.get('pwd')
    
            ret=models.UserInfo.objects.filter(name=username,pwd=password)
            if ret:
                request.session['is_login']=True
                request.session['username']=username
                return redirect('/index/')
            else:
                return redirect('/login/')
    
        return render(request,'login.html')
    
    def index(request):
        if not request.session.get('is_login'):
            return redirect('/login/')
        name=request.session.get('uername')
        return render(request,'index.html',{"name":name})
    
    def addBook(request):
        return render(request,'addBook.html')
    
    def log_out(request);
        request.session.flush()
        return redirect("/login/")
    #login.html
    <form action='/login/' method='post'>
        {% csrf_token %}
        <p>姓名<input type='text' name='user'></p>
        <p>密码<input type='pwd' name='pwd'></p>
        <input type='submit'>
    </form>
    
    #index.html
    
    <h3>welcome {{ name }}</h3>
    <a href="/logout/">注销</a>
    
    #addBook.html
    
    <form action='/login/' method='post'>
        {% csrf_token %}
        <p>书名<input type='text' name='user'></p>
        <p>价格<input type='pwd' name='pwd'></p>
        <input type='submit'>
    </form>

    auth认证模块

    不用这个模块,用session和cooike也可以
    只是这个模块更加简单

    #urls.py
    url(r'^login',views.login)
    url(r'^index',views.index)
    url(r'^logout',views.log_out)
    url(r'^reg',views.reg)
    #views.py
    from django.contrib import auth
    from django.contrib.auth.models import User
    
    def login(request):
        if request.method == "POST":
            username=request.POST.get('user')
            password=request.POST.get('pwd')
            user=auth.authenticate(username=username,password=password)
            if user:
                auth.login(request,user)
                return redirect('/index/')
            else:
                return redirect('/login/')
    
        return render(request,"login.html")
    
    def index(request):
        if not request.user.is_authenticated():
            return redirect('/login/')
        return render(request,'index.html')
    
    def log_out(request):
        auth.logout(request)
        return redirect('/login/')
    
    def reg(request):
        if request.method=="POST":
    
            user=request.POST.get('user')
            pwd=request.POST.get('pwd')
            User.objects.create_user(username=user,password=pwd)
            return redirect('/login/')
        return render(request,"reg.html")
    #login.html
    <form action='/login/' method='post'>
        {% csrf_token %}
        <p>姓名<input type='text' name='user'></p>
        <p>密码<input type='pwd' name='pwd'></p>
        <input type='submit'>
    </form>
    
    #index.html
    <li><a href="#">welcome {{ request.user }}</a></li>
    <li><a href="/logout/">注销</a></li>
    
    #reg.html
    <h3>注册</h3>
    <form action='/reg/' method='post'>
        {% csrf_token %}
        <p>姓名<input type='text' name='user'></p>
        <p>密码<input type='pwd' name='pwd'></p>
        <input type='submit'>
        <a href='/reg/'><input type='button' value='注册'></a>
    </form>

    Django-Ajax

    序列化操作:

    1.JSON.parse() # 将一个Json字符串转换为js对象
    2.JSON.stringify() # 将js转换为json字符串

    AJAX:
    1.异步
    2.局部刷新

    #urls.py
    url(r'^index/',views.index)
    url(r'^send_ajax/',views.send_ajax)
    url(r'^cal/',views.cal)
    url(r'^login/',views.login)
    #views.py
    def index(request):
    
        return render(request,'index.html')
    
    def send_ajax(request):
        return HttpResponse("OK")
    
    def cal(request):
        num1=request.GET.get("num1")
        num2=request.GET.get("num2")
        ret=int(num1)+int(num2)
        return HttpResponse(ret)
    
    def login(request):
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
    
        loginResponse={"user":None,"errorMsg":None}
        if user=="tom" and pwd=="123":
            loginResponse["user"]="tom"
        else:
            loginResponse["errorMsg"]="用户名或密码错误"
        import json
        return HttpResponse(json.dumps(loginResponse))
    #index.html
    <html>
    <head>
        <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script>
    </head>
    <body>
    <button>ajaxSend</button><span class='error'></span>
    {% csrf_token %}
    <p><input type="text" class="num1">+<input type="text" class="num2">=<input type="text" class="ret"><button class="cal">计算</button></p>
    <form action="">
        <p>姓名 <input type="text" class="user"></p>
        <p>密码 <input type="password" class="pwd"></p>
        <input type="button" value="submit" class="loginBtn"><span class="login_error"></span>
    </form>
    <script>
        //ajax实现
        $('button').click(function(){
            $.ajax({
                url:"/send_ajax/",
                type:"get",
                success:function(data){
                    $(".error").html(data)
                }
            })
        });
        //ajax计算
        $(".cal").click(function(){
            var num1=$(".num1").val();
            var num2=$(".num2").val();
            $.ajax(function(){
                url:"/cal/",
                type:"post",
                data:{
                    "num1":num1,
                    "num2":num2,
                    csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
                },
                success:function(data){
                    $(".ret").val(data)
                }
            })
        });
        //ajax登陆
        $(".loginBtn").click(function(){
            $.ajax(function(){
                url:"/login/",
                type:"POST",
                data:{
                    user:$(".user").val(),
                    pwd:$(".pwd").val(),
                    csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
                },
                success:function(data){
                    console.log(typeof data);      //string
                    var data= JSON.parse(data);      
                    console.log(typeof data);     //object
                    if(data["user"]){
                        location.href="/index/"   //成功后跳转
                    }
                    else{
                        var error_msg=data["error_Msg"];
                        $(".login_error").html(error_msg).css("color","red");
                        setTimeout(function(){
                            $(".login_error").html("")  //3s后清空文本
                        },3000)
                    }
                }
            })
        });
    </script>
    </body>
    </html>
  • 相关阅读:
    DDD CQRS架构和传统架构的优缺点比较
    ENode框架单台机器在处理Command时的设计思路
    C#分布式消息队列 EQueue 2.0 发布啦
    EQueue 2.0 性能测试报告
    EQueue文件持久化消息关键点设计思路
    EQueue性能测试计划
    ENode简介与各种教学视频资源汇总(要进群这篇文章必看)
    ENode框架Conference案例分析系列之
    ENode框架Conference案例分析系列之
    ENode框架Conference案例分析系列之
  • 原文地址:https://www.cnblogs.com/Ryans-World/p/7883255.html
Copyright © 2020-2023  润新知