本節內容概要:html
上節回顧及補充知識點:前端
1、請求週期:web
URL-》路由-》函數或類-》返回字符串或者模板ajax
Form表單提交:數據庫
提交-》url-函數或者類中的方法django
-....(執行)後端
HttpResponse('......')瀏覽器
render(request,'index.html')服務器
redirect('/index/')cookie
返回給用戶>>>>>用戶 永遠都是渲染處理完成的字符串
當接收到一個redirect時,自動發起另一個請求
Ajax:
$.ajax({
url:'/index/',
data:{'k':'v'},$(form對象).serilize()
type:'POST',
dataType:'JSON':
traditional:true,(寫了這個,才能將$(form對象).serilize()列表的值拿到)
success:function(d){
}
error:{
}
})
提交-》url-》函數或類中的方法
-....(執行)
HttpResponse('......')
render(request,'index.html')
不可使用redirect。。。。。。
返回一個字符串能夠,只能ajax後面本身作跳轉
2、路由系統URL:
a./index/ ->函數或類
b./index/(\d+) ->函數或類
c./index/(?P<nid>\d+) ->函數或類
d./index/(?P<nid>\d+) name='root' ->函數或類
reverse()
{% url 'root' 1 %}
e./crm/ include('app01.urls') ->路由分發
補充兩點:
f. 默認值
/index/ {'web':'root'} 爲函數傳遞一個值的默認值
def func(request,web):
print(name)
return HttpResponse('OK')
g.命名空間 namespace 用於include時定義名字的,和name起名字類似的意義
底下寫錯了,應爲:
v=reverse('author-polls:detail',kwargs={'pk':11})
{% url 'publisher:detail' pk=12 pp=99 %}
3、視圖系統
def func(request):
request.POST
request.GET
request.FILES
request.getlist
request.method
request.path_info
return render,HttpResponse,redirect
四、模板引擎
render(request,'index.html')
# for
# if
# 索引. keys values items all 都不加括號
五、MODEL數據庫操做
A、建立類 創建數據庫表
class User(models.Model):
username = models.CharField(max_length=32)
email=models.EmailField()
(Django Admin:有驗證功能)
User.objects.create(username='',email='dfadfasdfasdf')
User.objects.filter(id=1).update(email='666')
(無驗證功能)
B、一對多操做
class UserType(models.Model):
name = models.CharField(max_length=32)
class User(models.Model):
username = models.CharField(max_length=32)
email=models.EmailField()
user_type=models.ForeignKey("UserType")
user_list = User.objects.all()
for obj in user_list:
obj.username,obj.email,obj.user_type_id,obj.user_type.id,obj.user_type.name
user=User.objects.get(id=1) 單個對象
user.
User.objects.all().values("username","user_type__name") 跨表取數據的雙下劃線方式
C、多對多操做:
class UserType(models.Model):
name = models.CharField(max_length=32)
class User(models.Model):
username = models.CharField(max_length=32)
email=models.EmailField()
user_type=models.ForeignKey("UserType")
m=models.ManyToMany("UserGroup")
class UserGroup(models.Model):
name=...
obj=User.objects.get(id=1)
obj.m.add(2)
obj.m.add(2,3)
obj.m.add(*[1,2,3]) 注意,跟列表須要前面加一個*號
obj.m.remove(......)
obj.m.clear()
obj.m.set([1,2,3,4,5,6]) set跟列表時,不加*號,只保留當前這些列出來的關係
obj.m.all()
#多個組的對象,當前用戶全部的組
obj.m.filter(name='CTO')
Views模塊補充知識點:
請求的其餘信息:
不只發送數據,還要發送請求頭
下面咱們來看一下請求頭中都有些什麼內容能夠被使用:
請求的東西都存放在request中,因此根據request對象找到建立他的類WSGIRequest進行查看:
print(type(request))
#封裝了全部用戶請求的信息
print(request.environ) 返回全部原生數據
若是是經常使用的,則能夠調用request.GET或者request.POST請求處理數據
若是不在其中,只能本身經過environ處理原生數據了
for k,v in request.environ.items():
print(k,v)
能夠看到全部請求相關的信息,以字典方式存放
print (request.environ['HTTP_USER_AGENT'])
模板Template知識點補充:
模板的繼承:
母版:master.html
繼承的子網頁:extends
母版能夠在CSS樣式和JS引入的後面分別跟一個block塊,爲了子頁面能夠自定義樣式和JS腳本的地方。
子頁面中寫block內容的順序與顯示無關,能夠隨意寫了
一個子頁面只能繼承一個母版
模板的引入:include
一個頁面只能繼承一個母版,但能夠include多個html
include的文件也是支持渲染的,Django會先拼湊整合起帶各類模板語言標籤的文件,最終渲染成一個html
OpenStack後臺管理中就有大量的include調用
模板語言內置函數了解
自定義Simple tag:步驟
一、在應用中建立一個叫templatetag的目錄,不能叫其餘名字
二、在目錄中建立任意取名的py文件
三、在py文件中寫函數,函數名定義前面要加裝飾器,先要建立一個template對象,命名必須叫register
register = template.Libary()
四、經過它去生成一個裝飾器
@register.simple_tag
def func(a1,a2...)
這兩部的步驟代碼如圖所示:
五、使用自定義函數前須要註冊當前APP
六、想在哪一個html頁面使用這個自定義函數時,須要在html的頂部load一下 {% load xxoo%}
g、調用時只能用{% %}
h、傳參使用空格,多個空格也不要緊。
調用自帶函數
調用自定義函數:
自定義時有兩種方式:
@register.simple_tag 優勢:能夠多個參數,能夠帶空格 缺點:不能做爲if條件
@register.filter 缺點:只能最多兩個參數,不能有空格 優勢:能夠應用於{% if %}的條件
調用方式同自帶函數:{{」參數1」|函數名:」參數2」}}
若是要傳多個參數,只能拼湊多個參數成一個字符串傳給這兩個參數中:
{{「參數1」|函數名:「參數2,參數3」}}
{{」參數1」|」函數名:數字}}
*********PS:若是既有用到extends又用到load,在頁面頂部先寫extends語句,再寫load **********
自定義分頁:
前置說明 django自帶保護,以免XSS攻擊:
若是要將html部分標記語言放到後端生成後返回給前端,不能在前端直接顯示成html內容,只會以字符串形式顯示出來
若是要想轉換成html內容讓瀏覽器解析標記語言並顯示結果,須要說明一下:
兩種方式:1 前端 寫一個filter過濾
前端:{{ content|safe }}
or 2 後端將字符串包裝
from django.utils.safestring import mark_safe
page_str = "...."
page_str = mark_safe(page_str)
分頁邏輯:
上一個、下一個、跳轉:
最後能夠把分頁代碼整合成一個class類,使用的時候初始化並調用類中的方法便可
若是調用對象的方法,不想加括號的辦法,在方法的命名上方增長:@property
在後臺分頁回傳字符串的類方法中增長url參數後,能夠真正將這部分分頁代碼作成一個模塊,用於各個地方了。
將類提取出來單獨存放,之後能夠方便的引入調用。
代碼已有,能夠針對該類進行使用練習。
Cookie:
存儲在了客戶端瀏覽器本地文件中的一個與用戶有關的鍵值對,
經過審查元素->network,發一次請求,找到cookies,就能看到請求的cookies內容
註銷時,能夠從新設置Cookie的超時時間,讓退出後失效。
設置Cookie:response.set_cookie("")
讀取Cookie:request.cookies.get("")
基於Cookie的數據顯示條目:
Cookie在服務器端、客戶端均可以讀寫
可使用jQuery的插件Jquery.cookie簡單調用,代碼以下:
Cookie 加密:
加密加鹽相似hashlib加密方式:
用裝飾器實現用戶認證:
多頁面中不須要單獨每一個頁面再認證了
FBV裝飾器寫法:
CBV裝飾器寫法:
或
類中裝飾器能夠在函數方法名前寫,更能夠直接在類名前寫
做業題:
主機管理:
一、單表操做
二、一對多
三、多對多
要求:
a.刪除對話框
b.修改、添加時,使用新URL的方式
c.基於cookie進行用戶認證(本身寫裝飾器)
d.定製顯示數據條數
e.分頁
預習:
Form組件:http://www.cnblogs.com/wupeiqi/articles/6144178.html
Models操做:http://www.cnblogs.com/wupeiqi/articles/6216618.html