MVC與MTV概念 |
MTV與MVC(瞭解)
MTV模型(django):
M:模型層(models.py)
T:templates
V:視圖層views
MVC模型:
M:模型層(models.py)
V:視圖層(views.py)
C:控制器(Controller) urls.py
本質:django的MTV也是MVCcss
Ajax |
瀏覽器查看前端發送數據格式的方法:html
瀏覽器右鍵檢查,natwork 中 找到content type字段,顯示的就是提交數據的編碼格式;前端
前端向後端發送請求的方式:jquery
1 瀏覽器窗口手動輸入網址 get 請求ajax
2 a標籤的href屬性 get請求數據庫
3 form 表單 get/post請求(默認是get請求)django
4 ajax get/post請求json
前端向後端發送數據的編碼格式:bootstrap
1 urlencoded 後端
對應的數據格式:name=iason&password=666
後端獲取數據:request.POST
ps: diango 會將urlencoded編碼的數據解析自動放到POST中。
2 formdata
form表單傳輸文件的編碼格式
後端獲取文件格式數據:request.FILES
後端獲取普通鍵值對數據:request.POST
3 application
ajax發送json格式數據
注意事項:編碼與數據格式要一致
Ajax |
特色:異步提交,提交數據後不等待後臺返回結果就繼續幹其餘事;局部刷新,不像form表單提交方式,或者button提交是整個頁面刷新,ajax只是局部刷新。
基本語法:
前端語法:
$('#d1').click(function () { $.ajax({ // 提交的地址 url:'/index/', // 提交的方式 type:'post', // 提交的數據 data:{'name':'jason','password':'123'}, // 回調函數 success:function (data) { // data接收的就是異步提交返回的結果 alert(data) }
})
後端語法:
ajax json數據傳輸
1 ajax向後臺傳輸數據在body裏。
2 ajax傳輸json數據,必要要告訴後臺你傳輸的是json數據;contentTyle:‘application/json’
3 前端數據要序列化爲json格式:json.stringfly()
4 後臺json反序列化得到ajax傳輸的數據。
前端
<button id="b1"></button> <script> $('#b1').click(function () { $.ajax({ url:"", type:'post', data:JSON.stringify({'name':'李志','age':18}), contentType:'application/json', success: function (data) { alert(data) } }) }) </script>
後臺
def test(request): if request.method=='POST': data=request.body import json res=json.loads(data.decode('utf-8')) print(res) return HttpResponse('傳輸成功') return render(request, 'test.html', locals())
ajax 文件傳輸
前端語法:
後端語法:
form表單與ajax異同點
1.form表單不支持異步提交局部刷新
2.form表單不支持傳輸json格式數據
3.form表單與ajax默認傳輸數據的編碼格式都是urlencoded
批量插入數據 |
l=[] for i in range(10000): l.append(models.Book2(name='第%s本書'% i)) models.Book2.objects.bulk_create(l)
分頁
class Pagination(object): def __init__(self, current_page, all_count, per_page_num=2, pager_count=11): """ 封裝分頁相關數據 :param current_page: 當前頁 :param all_count: 數據庫中的數據總條數 :param per_page_num: 每頁顯示的數據條數 :param pager_count: 最多顯示的頁碼個數 用法: queryset = model.objects.all() page_obj = Pagination(current_page,all_count) page_data = queryset[page_obj.start:page_obj.end] 獲取數據用page_data而再也不使用原始的queryset 獲取前端分頁樣式用page_obj.page_html """ try: current_page = int(current_page) except Exception as e: current_page = 1 if current_page < 1: current_page = 1 self.current_page = current_page self.all_count = all_count self.per_page_num = per_page_num # 總頁碼 all_pager, tmp = divmod(all_count, per_page_num) if tmp: all_pager += 1 self.all_pager = all_pager self.pager_count = pager_count self.pager_count_half = int((pager_count - 1) / 2) @property def start(self): return (self.current_page - 1) * self.per_page_num @property def end(self): return self.current_page * self.per_page_num def page_html(self): # 若是總頁碼 < 11個: if self.all_pager <= self.pager_count: pager_start = 1 pager_end = self.all_pager + 1 # 總頁碼 > 11 else: # 當前頁若是<=頁面上最多顯示11/2個頁碼 if self.current_page <= self.pager_count_half: pager_start = 1 pager_end = self.pager_count + 1 # 當前頁大於5 else: # 頁碼翻到最後 if (self.current_page + self.pager_count_half) > self.all_pager: pager_end = self.all_pager + 1 pager_start = self.all_pager - self.pager_count + 1 else: pager_start = self.current_page - self.pager_count_half pager_end = self.current_page + self.pager_count_half + 1 page_html_list = [] # 添加前面的nav和ul標籤 page_html_list.append(''' <nav aria-label='Page navigation>' <ul class='pagination'> ''') first_page = '<li><a href="?page=%s">首頁</a></li>' % (1) page_html_list.append(first_page) if self.current_page <= 1: prev_page = '<li class="disabled"><a href="#">上一頁</a></li>' else: prev_page = '<li><a href="?page=%s">上一頁</a></li>' % (self.current_page - 1,) page_html_list.append(prev_page) for i in range(pager_start, pager_end): if i == self.current_page: temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,) else: temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,) page_html_list.append(temp) if self.current_page >= self.all_pager: next_page = '<li class="disabled"><a href="#">下一頁</a></li>' else: next_page = '<li><a href="?page=%s">下一頁</a></li>' % (self.current_page + 1,) page_html_list.append(next_page) last_page = '<li><a href="?page=%s">尾頁</a></li>' % (self.all_pager,) page_html_list.append(last_page) # 尾部添加標籤 page_html_list.append(''' </nav> </ul> ''') return ''.join(page_html_list)
前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <table class="table table-hover table-bordered table-striped"> <thead> <tr> <th>id</th> <th>name</th> </tr> </thead> <tbody> {% for book in page_queryset %} (*********) <tr> <td>{{ book.pk }}</td> <td>{{ book.name }}</td> </tr> {% endfor %} </tbody> </table> {{ page_obj.page_html|safe }} (*************) </div> </div> </div> </body> </html>
後臺
def booklist(request): book_list = models.Book2.objects.all() all_count = book_list.count() current_page = request.GET.get('page',1) page_obj = my_page.Pagination(current_page=current_page,all_count=all_count) page_queryset = book_list[page_obj.start:page_obj.end] return render(request,'booklist.html',locals())