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纔會給我處理