1 1、請求周期 2 url> 路由 > 函數或類 > 返回字元串或者模板語言? 3 4 Form表單提交: 5 提交 -> url > 函數或類中的方法 6 - .... 7 HttpResponse('....') 8 render(request,'index.html') 9 redirec ...
上節內容回顧:
1 1、請求周期 2 url> 路由 > 函數或類 > 返回字元串或者模板語言? 3 4 Form表單提交: 5 提交 -> url > 函數或類中的方法 6 - .... 7 HttpResponse('....') 8 render(request,'index.html') 9 redirect('/index/') 10 用戶 < < 返回字元串 11 (當接受到redirect時)自動發起另外一個請求 12 --> url ..... 13 14 Ajax: 15 $.ajax({ 16 url: '/index/', 17 data: {'k': 'v', 'list': [1,2,3,4], 'k3': JSON.stringfy({'k1': 'v'}))}, $(form對象).serilize() 18 type: 'POST', 19 dataType: 'JSON': 20 traditional: true, 21 success:function(d){ 22 location.reload() # 刷新 23 location.href = "某個地址" # 跳轉 24 } 25 }) 26 提交 -> url -> 函數或類中的方法 27 HttpResponse('{}') 28 render(request, 'index.html', {'name': 'v1'}) 29 <h1>{{ name }}</h1> --> 30 <h1>v1</h1> 31 32 XXXXXXX redirect... 33 用戶 <<<<< 字元串 34 35 36 2、路由系統URL 37 a. /index/ -> 函數或類 38 b. /index/(\d+) -> 函數或類 39 c. /index/(?P<nid>\d+) -> 函數或類 40 d. /index/(?P<nid>\d+) name='root' -> 函數或類 41 reverse() 42 {% url 'root' 1%} 43 e. /crm/ include('app01.urls') -> 路由分發 44 45 f. 預設值 46 url(r'^index/', views.index, {'name': 'root'}),#在url設置預設值 47 48 def index(request,name):#相關函數需要設置接收的形參 49 print(name) 50 return HttpResponse('OK') 51 52 g. 命名空間 53 54 /admin/ include('app01.urls',namespace='m1') 55 /crm/ include('app01.urls',namespace='m1') 56 57 app01.urls 58 /index/ name = 'n1' 59 60 61 reverser('m1:n1') 62 63 3、後臺取數據 64 def func(request): 65 request.POST 66 request.GET 67 request.FILES 68 request.getlist 69 request.method 70 request.path_info 71 72 return render,HttpResponse,redirect 73 74 4、模板語言 75 render(request, 'index.html') 76 # for 77 # if 78 # 索引. keys values items all 79 80 5、 資料庫 models操作 81 #創建一個表結構 82 class User(models.Model): 83 username = models.CharField(max_length=32) 84 email = models.EmailField() 85 86 有驗證功能 87 Django Admin 88 無驗證功能: 89 User.objects.create(username='root',email='asdfasdfasdfasdf') 90 User.objects.filter(id=1).update(email='666') 91 92 93 #創建一個表結構 用戶屬性表 94 class UserType(models.Model): 95 name = models.CharField(max_length=32) 96 97 #創建一個表結構 用戶信息表 98 class User(models.Model): 99 username = models.CharField(max_length=32) 100 email = models.EmailField() 101 user_type = models.ForeignKey("UserType")#外鍵 關聯 UserType 表 102 103 user_list = User.objects.all()#獲取User表,所有記錄 104 for obj user_list: 105 obj.username,obj.email,obj.user_type_id,obj.user_type.name,obj.user_type.id 106 107 user = User.objects.get(id=1)#獲取ID為1 的記錄 為對象 108 user. 109 110 User.objects.all().values("username","user_type__name",)#獲取所有記錄 的username 和 跨表的name 111 112 113 114 class UserType(models.Model): 115 name = models.CharField(max_length=32) 116 117 #創建一個表結構 用戶信息表 118 class User(models.Model): 119 username = models.CharField(max_length=32) 120 email = models.EmailField() 121 user_type = models.ForeignKey("UserType")#外鍵 關聯 122 m = models.ManyToMany('UserGroup')#與 UserGroup 的 第三張關聯表 多對多 123 124 #創建一個表結構 用戶組表 多對多 125 class UserGroup(models.Model): 126 name = .... 127 128 129 130 obj = User.objects.get(id=1)#獲取記錄對象 131 obj.m.add(2)#對第三張表進行添加關聯 132 obj.m.add(2,3) 133 obj.m.add(*[1,2,3]) 134 135 obj.m.remove(...)#對第三張表進行刪除關聯 136 137 obj.m.clear()#清除當前記錄的所有關聯關係 138 139 obj.m.set([1,2,3,4,5])#設置關聯 (重新所有的設置) 140 141 # 多個組,UserGroup對象 142 obj.m.all()# 143 obj.m.filter(name='CTO')#篩選出其中的一個組對象View Code
知識點:
Views
- 請求的其他信息
from django.core.handlers.wsgi import WSGIRequest request.environ request.environ['HTTP_USER_AGENT']#請求頭
- 裝飾器
FBV:
def auth(func): def inner(reqeust,*args,**kwargs): v = reqeust.COOKIES.get('username111')#獲取 cookies中的值 if not v: return redirect('/login/') return func(reqeust, *args,**kwargs) return inner
CBV:
from django import views from django.utils.decorators import method_decorator #裝飾dispatch 後, 等於對類中的每一個函數進行了裝飾 @method_decorator(auth,name='dispatch')#類中的 dispatch 為最先執行 class Order(views.View): # @method_decorator(auth) # def dispatch(self, request, *args, **kwargs): # return super(Order,self).dispatch(request, *args, **kwargs) # @method_decorator(auth) def get(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v})
Templates
- 母版...html
{% extends 'master.html' %}# 繼承母版(子級只能繼承一個母版) master.html 為母版文件 {% block title %}xxxxx{% endblock %}# 在母版 設置 子級中對應 可添加子級的專屬內容 include {% include 'tag.html' %}#組件 tag.html為組件 (子級可以加入多個組件)
- 自定義函數
simple_tag
a. app下創建templatetags目錄
b. 任意xxoo.py文件
c. 創建template對象 register
- from django.utils.safestring import matk_safe
register=template.Library()
d.
@register.simple_tag
def func(a1,a2,a3....)
return "asdfasd"
e. settings中註冊APP
f. 頂部 {% load xxoo %}
g. {% 函數名 arg1 arg2 %}
缺點:
不能作為if條件
優點:
參數任意
filter
a. app下創建templatetags目錄
b. 任意xxoo.py文件
c. 創建template對象 register
d.
@register.filter
def func(a1,a2)
return "asdfasd"
e. settings中註冊APP
f. 頂部 {% load xxoo %}
g. {{ 參數1|函數名:"參數二,參數三" }} {{ 參數1|函數名:數字 }}
缺點:
最多兩個參數,不能加空格
優點:
能作為if條件
分頁(自定義的分頁)
XSS:
{{ page_str|safe }}
mark_safe(page_str)
示例:
views.py
1 from utils import pagination 2 LIST = [] 3 for i in range(500): 4 LIST.append(i) 5 6 def user_list(request): 7 current_page = request.GET.get('p', 1)#頁面預設第一頁 8 current_page = int(current_page)#轉數字 9 10 val = request.COOKIES.get('per_page_count',10) #預設每頁 10 11 print(val) 12 val = int(val) 13 page_obj = pagination.Page(current_page,len(LIST),val)#創建類對象 傳入 當前頁面數值 列表長度 每頁顯示記錄數 14 #記錄數據 開始記錄數 結束記錄數 15 data = LIST[page_obj.start:page_obj.end]# 數據記錄進行切片取出 16 17 page_str = page_obj.page_str("/user_list/")#開始計算顯示的頁面 18 19 return render(request, 'user_list.html', {'li': data,'page_str': page_str})View Code
pagination.py
1 __author__ = 'Administrator' 2 from django.utils.safestring import mark_safe 3 4 5 class Page: 6 # 當前所在頁面 記錄條數統計 頁面顯示記錄數 顯示的頁面數量 7 def __init__(self, current_page, data_count, per_page_count=10, pager_num=7): 8 self.current_page = current_page#當前當前所在頁面 9 self.data_count = data_count#記錄條數統計 10 self.per_page_count = per_page_count#頁面顯示記錄數 11 self.pager_num = pager_num#顯示的頁面數量 12 13 #開始的記錄數 14 @property#裝飾後 不用加() 15 def start(self): 16 return (self.current_page - 1) * self.per_page_count 17 18 #結束記錄數 19 @property 20 def end(self): 21 return self.current_page * self.per_page_count 22 23 #計算當前所有數據 需要的總頁面數 24 @property 25 def total_count(self): 26 #商 餘 商計算 記錄條數統計 頁面顯示記錄數 27 v, y = divmod(self.data_count, self.per_page_count) 28 if y:#如果有餘數 29 v += 1#頁面數需加1 30 return v 31 32 #顯示頁面的方法函數 base_url為要跳轉到的頁面 ID 33 def page_str(self, base_url): 34 page_list = []#想要顯示的頁面列表 35 #當 所有的頁面數 小於 想要顯示的頁面數 36 if self.total_count < self.pager_num: 37 #從第一頁開始 38 start_index = 1 39 #到最後一頁 40 end_index = self.total_count + 1 41 42 else: 43 ##當前所在頁面數 小於等於 想要顯示的頁面數的 +1 的一半 ( 總頁面數 大於 想要顯示的頁面數 應對最前面的頁面顯示) 44 if self.current_page <= (self.pager_num + 1) / 2: 45 start_index = 1#第一頁面 46 end_index = self.pager_num + 1#想要顯示的頁面 47 else: 48 #開始頁面為選中頁面的 前面幾頁(想要顯示頁面的+1的一半數, 選中頁面保持中間位置 ) 49 start_index = self.current_page - (self.pager_num - 1) / 2 50 end_index = self.current_page + (self.pager_num + 1) / 2 51 #如果 當前所在頁面數 + 顯示頁面的 - 1 的一半 大於總頁面數,(應對最後面的顯示) 52 if (self.current_page + (self.pager_num - 1) / 2) > self.total_count: 53 start_index = self.total_count - self.pager_num + 1 54 end_index = self.total_count + 1 55 56 #如果當前為1時 57 if self.current_page == 1: 58 #上一頁不再跳轉 59 prev = '<a class="page" href="javascript:void(0);">上一頁</a>' 60 else: 61 prev = '<a class="page" href="%s?p=%s">上一頁</a>' % (base_url, self.current_page - 1,) 62 page_list.append(prev) 63 #迴圈 開始顯示頁面 結束顯示頁面 64 for i in range(int(start_index), int(end_index)): 65 #如果所選中的頁面,加CSS樣式 66 if i == self.current_page: 67 temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i) 68 else: 69 temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i) 70 page_list.append(temp) 71 #如果當前所在頁面 等於 最後的頁面 72 if self.current_page == self.total_count: 73 #下一頁不再跳轉 74 nex = '<a class="page" href="javascript:void(0);">下一頁</a>' 75 else: 76 nex = '<a class="page" href="%s?p=%s">下一頁</a>' % (base_url, self.current_page + 1,) 77 page_list.append(nex) 78 #跳轉頁面 input框 79 jump = """ 80 <input type='text' /><a onclick='jumpTo(this, "%s?p=");'>GO</a> 81 <script> 82 function jumpTo(ths,base){ 83 var val = ths.previousSibling.value; 84 location.href = base + val; 85 } 86 </script> 87 """ % (base_url,) 88 89 page_list.append(jump)#加入列表 90 91 page_str = mark_safe("".join(page_list))#拼接列表為長字元串 92 93 return page_strView Code
user_list.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 .pagination .page{ 8 display: inline-block; 9 padding: 5px; 10 background-color: cyan; 11 margin: 5px; 12 } 13 .pagination .page.active{ 14 background-color: brown; 15 color: white; 16 } 17 </style> 18 </head> 19 <body> 20 <ul> 21 {% for item in li %} 22 {% include 'li.html' %} 23 {% endfor %} 24 </ul> 25 26 <div> 27 <select id="ps" onchange="changePageSize(this)"> 28 <option value="10">10</option> 29 <option value="30">30</option> 30 <option value="50">50</option> 31 <option value="100">100</option> 32 </select> 33 </div> 34 35 <div class="pagination"> 36 {{ page_str }} 37 </div> 38 <script src="/static/jquery-1.12.4.js"></script> 39 <script src="/static/jquery.cookie.js"></script> 40 <script> 41 42 $(function(){ 43 {# var v = $.cookie('per_page_count', {'path': "/user_list/"});#} 44 var v = $.cookie('per_page_count'); 45 $('#ps').val(v); 46 }); 47 48 function changePageSize(ths){ 49 var v = $(ths).val(); 50 console.log(v); 51 $.cookie('per_page_count',v, {'path': "/user_list/"}); 52 53 location.reload(); 54 } 55 </script> 56 </body> 57 </html>View Code
cookie
客戶端瀏覽器上的一個文件
1 {"user": 'dachengzi'} 2 3 request.COOKIES.get('username111')#獲取 COOKIES的內容 4 5 response = render(request,'index.html') 6 response = redirect('/index/') 7 # 設置cookie,關閉瀏覽器失效 8 response.set_cookie('key',"value") 9 10 # 設置cookie, N秒只有失效 11 response.set_cookie('username111',"value",max_age=10) 12 13 # 設置cookie, 截止時間失效 14 import datetime 15 current_date = datetime.datetime.utcnow()#現在的時間 16 current_date = current_date + datetime.timedelta(seconds=5)# 加上5秒 17 response.set_cookie('username111',"value",expires=current_date)# 等 於5 稱後過期 18 response.set_cookie('username111',"value",max_age=10)View Code