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>
原文地址:https://www.cnblogs.com/Ryans-World/p/7883255.html