Django階段總結與Ajax

1、路由控制html

2、視圖層前端

3、模板層jquery

4、模型層、單表操做、多表操做web

5、什麼是ajaxajax

 

1、路由控制正則表達式

  補充點(什麼是web應用?)數據庫

  網站:BS架構應用程序:B是瀏覽器  S:server(實現了wsgi協議)+application(咱們都在寫這個),其實就是CSdjango

  MVC和MTV(django)json

    -M:model跟數據庫打交道後端

    -T:Templates模板層,對到mvc的是V這一層

    -V:視圖Views路由+V是MVC的c

  web框架:

    application拆分

    a:server b:映射關係  c:模板渲染

    Flask:

    Django

    Tornado

  1.Django中路由的做用

    請求的路徑跟視圖函數的映射關係

  2.簡單的路由配置

    四個參數:第一個正則表達式,第二個函數內存地址,第三個默認值,第四個是別名

  3.分組

    無名:(正則表達式)值分出來當關鍵字參數傳到視圖函數

    有名:(?P<名字>正則表達式)值分出來當關鍵字參數傳到視圖函數

  4.路由分發

    url(r‘^app01/’,include('app01,urls'))

  5.反向解析

    就是根據別名,取到對應的url地址

      -視圖層:reverse('別名'args=())

      -模板層:{% url ‘別名’ 參數 參數 %}

  6.名稱空間

    -include(‘app01.urls’,namespance=‘app01’)

    -之後再反向解析:reverse(‘app01:別名’args=())

  7.Django2.0版的path

    -path:路徑是準確路徑,不是正則表達式了

    -內置了5個轉換器

    -自定義轉換器

2、視圖層

  1.視圖函數

  2.HttpResponse對象

    -GET

    -POST

    -FILES

    -path

    -method

    -get_full_path()

    -body

  3.HttpResponse

    -三件套

  4.JsonResponse

    -HttpResponse+json  

  5.CBV和FBV

    -基於類的視圖:

      -url配置 類名.as_view()

      -views.py

        class Test(View)

          dispatch:總的分發方法

          def get(self,request)

            return HttpRequest對象

  6.簡單文件上傳

    -前端頁面:form-data

    -視圖層:FILES(字典)根據Key值取出來,拿到文件對象

  問題:POST請求是否能夠在請求路徑中參加參數?能夠,從GET中取

    -反向解析傳參

      舉例:在模板層反向解析出要刪除的圖書路徑

      -url(r'^dlbook/(?P<pk>\d+)',view.deletebook,name='deletebook'),

      -<td><a href="{% url'deletebook' book.pk %}">刪除</a></td>

 

3、模板層

 

  1.模板簡介

    模板語言

  2.模板語法之變量

    -基本用法{{ 變量名 }}

    -深度查詢

    {{ 對象.方法 }} 方法不能傳參數

    -字典,列表 用.

  3.模板之過濾器

    -data

    -dafault

    -slice

    ...

  4.模板之標籤

    {% for %}       {% for a in 可迭代對象 %}         {{ a.name }}         {{ forloop }}       {% endfor %}     {% if 條件%}     {% elif條件 %}     {% else %}     {% endif %}

    {% with %}:取別名

 

  5.自定義標籤和過濾器

    1.確認app是否已通過期

    2.在app下建立一個包:templatetags

    3.在包中寫mytag.py

    4.from django.template import LIbrary

    5.register=Library()

    6.標籤:

@register.simple_tag(別名) def mytesttag(a,b,c) return a+b+c

 

     過濾器

@register.filter(別名) def mytestfilter(別名)   return a+b

    7.使用標籤

{% load mytag %} 標籤 {% mytesttag 參數1,參數2,參數3... %} 過濾器 {{ 第一個參數|mytestfilter:'第二個參數' }}

  

  6.模板導入和繼承  

    -導入{% include ‘在模板中定義盒子’ %}

    -繼承

     

 -先寫一個母版,在模板中定義盒子       {% block content %}         {% endblock %}       -使用:         在其餘模板中:         {% extends % 'base.html'}                 {% block content %}         寫變化的內容         {% endblock %}       {{ block.super }} 會把原來的母版中的內容拿過來

 

4、模型層、單表操做、多表操做

  -單表:基本查詢,雙下劃線的模糊查詢

  -多表:

    基於對象的跨表

    基於雙下劃線的多表

    聚合查詢

      -聚合函數使用

    F,Q查詢

      F能夠去除字段的值

      Q查詢:構造出與或非的關係

    分組查詢:

 ''' group by誰就以誰作基表 filter在前表示where filter在後表示having values在前表示group by 的字段 values在後表示取值 ''' #查詢每一個出版社的名稱和書籍個數 

     

5、什麼是ajax

  經過js語言跟後臺進行交互的一個東西

    -特色;異步,局部刷新

# 後臺views.py

from django.shortcuts import render, HttpResponse # Create your views here.
def index(request): if request.method == 'GET': return render(request, 'index.html')

# 前臺index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="/static/jquery-3.3.1.js"></script>
    <title>Title</title>
</head>
<body>
<button id="btn">點我向後臺發數據</button>
<span id="sp"></span>
<p><button id="btn2">點我</button></p>


<br>
<input type="text" id="first">+<input type="text" id="second">=<input type="text" id="sum"><button id="btn3">計算</button>
</body>

<script> $('#btn2').click(function () { alert(2222) }) $('#btn').click(function () { {#alert(1)#} //日後臺提交數據,jquery封裝的方法
 $.ajax({ 'url':'/test/', //請求的路徑
            'type':'get', //請求的方法
 success:function (data) { //data 是後臺返回的數據
 console.log(data) $("#sp").text(data) } }) }) $("#btn3").click(function () { /** var first=$("#first").val() var second=$("#second").val() var sum=first+second $ ("#sum").value(sum) **/ $.ajax({ url:'/sum/?aa=123', type:'post', data:{first:$("#first").val(),second:$("#second").val()}, success:function(data){ //alert(data)
 $("#sum").val(data) } }) }) </script>
</html>

 

案例要求:

  1 後臺返回json格式
   2 問?返回render,返回redirect?
 
 基於ajax寫一個登錄功能,一旦登錄成功,跳轉到百度,登錄失敗,在頁面顯示用戶名或密碼錯誤

 

 

# views.py

from django.shortcuts import render, HttpResponse # Create your views here.
def index(request): if request.method == 'GET': return render(request, 'index.html') def test(request): if request.method == 'GET': import time # time.sleep(10)
        return HttpResponse('hello web') import json from django.http import JsonResponse def login(request): dic={'status':100,'msg':None} if request.method == 'GET': return render(request, 'login.html') # if request.is_ajax():
    if request.method=='POST': name=request.POST.get('name1') pwd=request.POST.get('pwd2') if name=='lqz' and pwd=='123': dic['msg'] = '登錄成功'
            # 想讓前端跳轉
            # dic['url']='http://www.baidu.com'
            dic['url']='/test/'
        else: # 返回json格式字符串
            dic['status']=101 dic['msg']='用戶名或密碼錯誤'
        # return JsonResponse(dic)
        return HttpResponse(json.dumps(dic)) def loginjson(request): dic={'status':100,'msg':None} if request.method=='POST': print(request.POST) print(request.GET) print(request.body) xx=request.body.decode('utf-8') # re是個字典{"name1":"lqz","pwd2":"123"}
        re=json.loads(xx) request.POST=11


        print(request.POST) #         #         # name=re.get('name1')
        # pwd=re.get('pwd2')
        # print(name)
        # print(pwd)
        return HttpResponse('ok')

 

#login登陸頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="/static/jquery-3.3.1.js"></script>
    <title>登錄</title>
</head>
<body> {#<form action="" method="post">#} <p>用戶名:<input type="text" id="name"></p>
    <p>密碼:<input type="password" id="pwd"></p> {# 這裏不能這麼寫了#} {# <input type="submit" value="提交1">#} {# <button>提交2</button>#} <input type="button" value="提交3" id="submit"><span id="error"></span>
    <input type="button" value="提交json格式" id="submit1"><span id="error"></span> {#</form>#} </body>

<script> $('#submit').click(function () { $.ajax({ url:'/login/', type:'post', data:{name1:$("#name").val(),pwd2:$("#pwd").val()}, success:function (data) { //後臺用JsonResponse返回數據
                //data 就會被轉成字典
 console.log(data) console.log(typeof data) //JSON.parse(data) 把字符串類型轉成字典
 data=JSON.parse(data) {#JSON.stringify()#} console.log(typeof dat1) if(data.status == 100){ //成功,跳轉到指定頁面
                    //location.href=地址,前端就會跳轉到指定的url
 alert(data.msg) //$("#error").text(data.msg+'正在跳轉')
                    //location.href=data.url
 }else{ $("#error").text(data.msg) } } }) }) $('#submit1').click(function () { postdata={name1:$("#name").val(),pwd2:$("#pwd").val()} $.ajax({ url:'/loginjson/', type:'post', //指定提交的編碼格式是json格式,
            //contentType:'application/json',
            //data:JSON.stringify(postdata),
            //data:postdata,
 data:'123', success:function (data) { console.log(data) } }) }) </script>
</html>

 

總結:

  1.後端若是返回JsonResponse,前端的ajax內部會自動將json格式字符串轉換成字典

  2.後端若是返回HttpResponse,前端的ajax內部不會自動給你轉換,拿到的data是字符串形式,須要手動JSON.parse(data)來轉成字典

  3.字符串轉字典:JSON.parse(data)

   字典轉字符串:aa=JSON.stringify(字典對象)

  4.若是前端傳的格式是JSON,django不會處理body中的內容,須要本身處理

   只有前端傳的格式是urlencoded,form-data格式,django纔會給我處理

相關文章
相關標籤/搜索