日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

發布時間:2024/9/30 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀目錄

  • 一、MVC與MTV
  • 二、多對多表的創建
  • 三、ajax,前后端傳輸編碼格式contentType
  • 四、批量插入數據與自定義分頁器

摘要

  • MTV與MVC
  • 多對多表三種創建方式
  • ajax ,前后端傳輸數據編碼格式contentType
  • 批量插入數據和自定義分頁器

一、MVC與MTV

  • MVC(Model View Controller 模型-視圖-控制器)
    是一種Web架構的模式,所謂MVC就是把web應用分為模型(M),控制器?,視圖(V)三層;他們之間以一種插件似的,松耦合的方式連接在一起。
    模型負責業務對象與數據庫的對象(ORM),視圖負責與用戶的交互(頁面),控制器?接受用戶的輸入調用模型和視圖完成用戶的請求。

    Model: 代表數據存取層, View 代表的是系統中選擇顯示什么和怎么顯示的部分, Controller
    指的是系統中根據用戶輸入并視需要訪問模型,以決定使用哪個視圖的那部分。

  • MTV(Model Templates View 模型-模板-視圖)Django框架就是MTV模型: Models:數據存取層。
    該層處理與數據相關的所有事務:
    如何存取、如何驗證有效,是一個抽象層,用來構建和操作你的web應用中的數據,模型是你的數據的唯一的、權威的信息源。它包含你所儲存數據的必要字段和行為。通常,每個模型對應數據庫中唯一的一張表。
    模板(templates):即表現層。 該層處理與表現相關的決定:
    如何在頁面或其他類型文檔中進行顯示。模板層提供了設計友好的語法來展示信息給用戶。使用模板方法可以動態地生成HTML。模板包含所需HTML
    輸出的靜態部分,以及一些特殊的語法,描述如何將動態內容插入。
    視圖(views):業務邏輯層,該層包含存取模型及調取恰當模板的相關邏輯。用于封裝負責處理用戶請求及返回響應的邏輯。視圖可以看作是前端與數據庫的中間人,他會將前端想要的數據從數據庫中讀出來給前端。他也會將用戶要想保存的數據寫到數據庫。
    Django的MTV模式本質上與MVC模式沒有什么差別,也是各組件之間為了保持松耦合關系,只是定義上有些許不同,Django的MTV分別代表:

    Model(模型):負責業務對象與數據庫的對象(ORM)Template(模版):負責如何把頁面展示給用戶View(視圖):負責業務邏輯,并在適當的時候調用Model和Template此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Templat![在這里插入圖片描述](https://img-blog.csdnimg.cn/20190722141421949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYyNTE0Mw==,size_16,color_FFFFFF,t_70)

二、多對多表的創建

  • 第①種:Django自帶的ORM自動創建的多對多表(ManyToManyField(to=’…‘))
-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------# 多表查詢示例表 class Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)publish_date = models.DateField(auto_now_add=True)# 外鍵關系# 一對多:(外鍵)publish = models.ForeignKey(to='Publish')# 多對多:author = models.ManyToManyField(to='Author') # 這是一個虛擬字段, 信號字段class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()

很顯然,Django自動創建的多對多表,支持雙下劃線查詢語法。

  • 第②種純手動創建多對多表:
# 多對多表創建實例:class MyBook(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)publish_date = models.DateField(auto_now_add=True)class MyAuthor(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()class MyBook2MyAuthor(models.Model):# 這里的book和author不要加_id,因為會Django識別ForenginKey,并給其自動加上_idbook = models.ForeignKey(to='MyBook')author = models.ForeignKey(to='MyAuthor')#純手動創建多對多,可以在該關聯表中加入自己需要的字段info = models.CharField(max_length=32) # models中表關系映射創建完了,記得一定要對Django數據庫進行遷移(保存)操作數據庫遷移方法一: cmd命令: python3 manage.py makemigrations migrate數據庫遷移方法二: pycharm中菜單欄Tools下有個Run manage.py Task...打開輸入如下命令 makemigrations migrate

數據庫遷移完之后我們看看創建的三張表(Navicat查看):

先創建一些數據:
提示一下:為了直接在Django頁面中運行我們的測試表查詢代碼,快速顯示結果,我們需要對Django進行配置一下:配置方法見我另一篇

# 測試表查詢py文件內: import osif __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "created_by_pycharm.settings")import djangodjango.setup()from app01 import modelsmodels.MyAuthor.objects.create(name='吳承恩', age=100)models.MyAuthor.objects.create(name='吳彥祖', age=30)models.MyAuthor.objects.create(name='劉德華', age=45)models.MyAuthor.objects.create(name='劉志鵬', age=18)models.MyAuthor.objects.create(name='曹雪芹', age=120)res1 = models.MyBook.objects.create(title='西游記', price=66.6)res2 = models.MyBook.objects.create(title='東游記', price=99.9)res3 = models.MyBook.objects.create(title='南游記', price=88.8)res4 = models.MyBook.objects.create(title='北游記', price=68.6)# 由于多對多這張表是我們自己創建的,所以在數據庫中是真實存在的,它關聯著MyAutho和# MyBook這2張表,所以添加表關系的時候在任何一個MyBook或者是MyAuthor# 表對象點mybook2myauthor_set.add()的方法是行不通的:# models.MyBook.objects.filter(pk=1).first().mybook2myauthor.add(5)# 錯誤提示:AttributeError: 'MyBook' object has no attribute 'mybook2myauthor'# 因為外鍵建立在多對多那張關聯表中,所以要添加關系需要在這張表中動手腳models.MyBook2MyAuthor.objects.create(book_id=1, author_id=1)models.MyBook2MyAuthor.objects.create(book_id=1, author_id=2)models.MyBook2MyAuthor.objects.create(book_id=2, author_id=2)models.MyBook2MyAuthor.objects.create(book_id=2, author_id=3)models.MyBook2MyAuthor.objects.create(book_id=3, author_id=4)models.MyBook2MyAuthor.objects.create(book_id=4, author_id=5)

下面來驗證手動創建的多對多表可否使用Django的ORM表查詢和基于雙下劃線的反向查詢:

# res1 = models.MyBook.objects.filter(pk=1).first().author.name# print(res1) # 報錯:'MyBook' object has no attribute 'author'# res2 = models.MyBook.objects.filter(pk=1).first().mybook2myauthor_set.all().info# print(res2)# res4 = models.MyBook.objects.filter(pk=1).first().author_set.all().name# print(res4) # 報錯# res5 = models.MyBook.objects.filter(pk=1).values('author__name')# print(res5) # 報錯很顯然用原來的orm方法貌似不行,同時用下劃線試了也不行

很顯然,外鍵的建立位置變了,肯定這樣查不行,外鍵全部在mybook2myauthor這張表中,所以要想從一張表查到另外一張表,必須要先經過mybook2myauthor這張表。
至于如何查詢,本文不作深入探討,咱們繼續下一種方法:半自動化建立多對多表。

  • 半自動創建多對多表(該方法的可拓展性高,并且符合ORM查詢規則,在項目中使用頻率也最高,需要重點掌握)
class Books(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)publish_date = models.DateField(auto_now_add=True)author = models.ManyToManyField(to='Authors', through='Books2Authors', through_fields=('book', 'author'))class Authors(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()class Books2Authors(models.Model):book = models.ForeignKey(to='Books')author = models.ForeignKey(to='Authors')#純手動創建多對多,可以在該關聯表中加入自己需要的字段info = models.CharField(max_length=32)

# 創建一些數據,添加表關系models.Authors.objects.create(name='吳承恩', age=100)models.Authors.objects.create(name='吳彥祖', age=30)models.Authors.objects.create(name='劉德華', age=45)models.Authors.objects.create(name='劉志鵬', age=18)models.Authors.objects.create(name='曹雪芹', age=120)res1 = models.Books.objects.create(title='西游記', price=66.6)res2 = models.Books.objects.create(title='東游記', price=99.9)res3 = models.Books.objects.create(title='南游記', price=88.8)res4 = models.Books.objects.create(title='北游記', price=68.6)models.Books2Authors.objects.create(book_id=1, author_id=1)models.Books2Authors.objects.create(book_id=1, author_id=2)models.Books2Authors.objects.create(book_id=2, author_id=2)models.Books2Authors.objects.create(book_id=2, author_id=3)models.Books2Authors.objects.create(book_id=3, author_id=4)models.Books2Authors.objects.create(book_id=4, author_id=5) # ORM查詢可行性res = models.Books.objects.filter(pk=1).first().author.all().values('name')res1 = models.Authors.objects.filter(pk=1).first().books_set.all().values('title')print(res) # <QuerySet [{'name': '吳承恩'}, {'name': '吳彥祖'}]>print(res1) # <QuerySet [{'title': '西游記'}]> # 雙下劃線查詢可行性:res = models.Books.objects.filter(pk=1).values_list('author__name')res1 = models.Authors.objects.filter(pk=1).values_list('books__title')print(res) # <QuerySet [('吳承恩',), ('吳彥祖',)]>print(res1) # <QuerySet [('西游記',)]>

通過上面查詢結果可知這種半自動創建多對多表的方法可以使用ORM查詢方法也支持雙下劃線方法

三、ajax,前后端傳輸編碼格式contentType

  • ①urlencoded (默認格式) 對應數據格式:name=jason&password=666 后端獲取方式:request.POST
    django會將urlencoded編碼數據解析自動放到request.POST中
  • ②formdata(form表單傳輸文件編碼格式)
    注意form表單默認的傳輸編碼格式是urlencoded(enctype=“application/x-www-form-urlencoded”),如果需要傳輸文件,這里需要手動設置成formdata格式(enctype=“multipart/form-data”),
    后端:通過request.POST 繼續獲取普通字符串格式數據,通過request.FILES獲取文件格式數據
  • ③JSON格式(ajax支持) 什么是JSON: SON 指的是 JavaScript 對象表示法(JavaScript Object
    Notation) JSON 是輕量級的文本數據交換格式 JSON 獨立于語言 * JSON 具有自我描述性,更易理解
    • JSON 使用 JavaScript 語法來描述數據對象,但是 JSON 仍然獨立于語言和平臺。JSON 解析器和 JSON 庫支持許多不同的編程語言。

      合格的json對象(json只認雙引的字符串格式):
["one", "two", "three"] { "one": 1, "two": 2, "three": 3 } {"names": ["張三", "李四"] } [ { "name": "張三"}, {"name": "李四"} ] 

不合格的json對象:

{ name: "張三", 'age': 32 } // 屬性名必須使用雙引號 [32, 64, 128, 0xFFF] // 不能使用十六進制值 { "name": "張三", "age": undefined } // 不能使用undefined { "name": "張三","birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),"getName": function() {return this.name;} // 不能使用函數和日期對象 }
  • 關于JSON在JavaScript中的2個方法: stringfy與parse方法
    JavaScript中關于JSON對象和字符串轉換的兩個方法: JSON.parse(): 用于將一個 JSON 字符串轉換為
    JavaScript 對象(json只認雙引的字符串格式)
JSON.parse('{"name":"Howker"}'); JSON.parse('{name:"Stack"}') ; // 錯誤 JSON.parse('[18,undefined]') ; // 錯誤

JSON.stringify(): 用于將 JavaScript 值轉換為 JSON 字符串。

JSON.stringify({"name":"Tonny"})
  • 補充 JSON與XML的區別 JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁瑣笨重的 XML
    格式。

    JSON 格式有兩個顯著的優點:書寫簡單,一目了然;符合 JavaScript
    原生語法,可以由解釋引擎直接處理,不用另外添加解析代碼。所以,JSON迅速被接受,已經成為各大網站交換數據的標準格式,并被寫入ECMAScript
    5,成為標準的一部分。

    XML和JSON都使用結構化方法來標記數據,下面來做一個簡單的比較。

    用XML表示中國部分省市數據如下:

    由上面的兩端代碼可以看出,JSON 簡單的語法格式和清晰的層次結構明顯要比 XML 容易閱讀,并且在數據交換方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得節約傳輸數據所占用得帶寬。

  • ajax簡介: AJAX(Asynchronous Javascript And
    XML)翻譯成中文就是“異步的Javascript和XML”。即使用Javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML)。

    AJAX 不是新的編程語言,而是一種使用現有標準的新方法。

    AJAX
    最大的優點是在不重新加載整個頁面的情況下,可以與服務器交換數據并更新部分網頁內容。(這一特點給用戶的感受是在不知不覺中完成請求和響應過程)

    AJAX 不需要任何瀏覽器插件,但需要用戶允許JavaScript在瀏覽器上執行。

    同步交互:客戶端發出一個請求后,需要等待服務器響應結束后,才能發出第二個請求;
    異步交互:客戶端發出一個請求后,無需等待服務器響應結束,就可以發出第二個請求。

  • ajax的基本使用方法:
    #前端向后端請求方式:1 瀏覽器手動輸入網址(get請求),2 a標簽的href屬性(get請求),form表單(get/post請求,默認為get)
    #ajax特點:異步提交、局部刷新
    #基本使用語法:   提交url (url:’…‘)   提交方式 (type: ‘post’)   提交數據 (data:{’’’})   提交后通過回調函數得到的返回結果 (sucess:function(data){…})
    #基本使用示例:(ajax的默認傳輸數據的格式是urlencoded)

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>圖書管理系統</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script><link rel="stylesheet" href="/static/layui/css/layui.css"><script src="/static/layui/layui.js"></script><script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script></head> <body> <button class="btn btn-success" id="b1">AJAX測試</button> <script>{#綁定按鈕點擊觸發ajax提交數據#}$('#b1').on('click', function () {$.ajax({ {#固定語法格式#}url: '', {#不寫默認朝當前頁面發請求#}type: 'post', {#請求方式#}data : {'name': 'sgt', 'pwd': '123'}, {#發送的請求數據#}{#這里的data就是回調函數success獲取到的后端響應返回的數據#}success:function (data) {swal({title: 'AJAX',text: '模擬這里顯示了返回的數據',icon: 'success',button: 'OK',})}})}) </script> </body> </html>

我們知道ajax默認的傳輸數據格式是urlencoded,前面我們說過,ajax可以用json作為數據格式傳輸
現在強調一點:前后端傳輸數據必須要求數據是什么格式就應該用對應的傳輸格式,一一對應去傳輸,否則Django解析數據出問題,以至于我們在前后端拿不到想要的數據。

所以:
第一:我們需要在ajax發送請求代碼中指定發送數據格式:
contentType: ‘application/json’,
第二:后端獲取json格式數據不再是request.POST,而是通過request.body(得到的是一個bytes類型的json格式數據),所以再處理一下:
res = json.loads(request.body.decode(‘utf-8’)),這就得到前端ajax發送過來的json格式數據

  • ajax傳文件 前端:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>圖書管理系統</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script><link rel="stylesheet" href="/static/layui/css/layui.css"><script src="/static/layui/layui.js"></script><script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script></head> <body><input type="file" id="f1"><br><button id="s1" class="btn btn-default">提交</button> <script>//需要知道,ajax無法自己傳文件,需要借助于內置對象FormData$('#s1').on('click', function () {//ajax借助FormData內置對象傳文件let formdata = new FormData();//FormData不僅能傳文件,也能傳普通鍵值formdata.append('name', 'sgt'); <!--添加普通鍵值-->//獲取input框存放文件file_data = $('#f1')[0].files[0];//$('#f1')[0]是將jQuery對象轉換成js對象,然后通過js對象點files來獲取到文件對象,然后去索引0才能拿到文件對象formdata.append('myfile', file_data);//使用ajax發送文件$.ajax({url: '',type: 'post',data: formdata, <!--傳輸數據為formdata-->processData: false, <!--告訴瀏覽器不要處理數據-->contentType: false, <!--不要用任何編碼,就用我formdata自帶的格式,因為Django能自動識別formdata-->//回調函數獲取提交后后端返回的數據success:function (data) {swal({ <!--用SweetAlert顯示結果-->title: '傳輸文件',text: data,icon: 'success',button: 'OK',})}})}) </script> </body> </html>

后端

def ttt(request):if request.method == 'POST':print(request.POST) # 拿到ajax傳來的formdata普通鍵值數據print(request.FILES) # 拿到ajax傳來的formdata文件return HttpResponse('我從后端來,文件[%s]已收到' % request.FILES.get('myfile'))return render(request, 'ttt.html')


通過ajax監控input框,發送數據到后端判斷輸入用戶名是否存在與數據庫user表中
前端:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>圖書管理系統</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script><link rel="stylesheet" href="/static/layui/css/layui.css"><script src="/static/layui/layui.js"></script><script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script> </head> <body> <div class="container"><div class="row"><div class="col-sm-4 col-sm-offset-4">用戶名: <input type="text" class="user form-control"><span class="hide" style="color: red">用戶已存在</span></div></div> </div> <p></p> <script>//input事件來實時監控input框輸入的數據,如果用change,則在input框失去焦點時候觸發$('.user').on('input',function () {$.ajax({url: '',type: 'post',data: {'username': $(this).val()},success:function (data) {{#res = JSON.parse(data);#}if (data['flag']){$('div>span').removeClass('hide')}else {$('div>span').addClass('hide')}}})})</script></body> </html>

后端:

def ttt(request):if request.method == 'POST':res = {'flag': False}# 獲取到ajax發送過來的usernameusername = request.POST.get('username')# 通過username進行數據庫查詢user_obj = models.User.objects.filter(name=username).first()# 判斷用戶名是否存在與數據庫中if user_obj:res['flag'] = Truereturn JsonResponse(res)return render(request, 'ttt.html')

結果演示:

總結一下:
form表單與ajax的異同點:
1、form表單不支持異步提交,局部刷新
2、form表單不支持傳輸json格式數據
3、form表單與ajax默認傳輸數據編碼格式都是urlencoded

四、批量插入數據與自定義分頁器

  • bulk_create批量插入數據
    當我們使用orm來一次性新增很多表記錄的時候,等待結果的時間會非常的慢,如果一次性需要批量插入很多數據的時候就需要使用bulk_create來批量插入數據
import randomuser_list = ['用戶[{}]'.format(i) for i in range(100)] data = [] for j in user_list:data.append(models.MyUser(name=j, password='123', gender=str(random.choice([1, 2, 3])))) models.MyUser.objects.bulk_create(data)
  • 自定義分頁器 自定義分頁器的實現過程: 每一頁顯示多少條數據
    第n頁顯示的數據在全部條數據中的開始和結尾索引位置,然后通過這個索引位置進行切片處理,取出這一頁的所有數據的對象列表,在后端進行for循環渲染成html代碼后通過模板語法發送到前端,通過safe方法實現前端的動態渲染,達到點擊對應頁數標簽進行頁面切換的效果顯示
    tip:需要用到的相關知識與方法:列表的切片[0:10],a標簽的href="?page=6"(路徑前加上一個?,表示當前路徑自動補全),divmod()方法(div(100,9)>>(11,1)
    除取余),models.User.objects.all().count()計算記錄總條數
    分頁器的實現如果自己寫下來還是比較麻煩的,所以我們直接使用已經封裝好的分頁器就行了,下面介紹一個分頁器模板,只需幾步操作就
    下面通過上面的批量插入數據和分頁器模板來實現分頁效果:
    先批量插入數據:
l = [models.User(name='這是第%s記錄' % i) for i in range(1000)]models.User.objects.bulk_create(l)

然后操作分頁器的實現:
①:app01程序文件夾下面新建文件夾utils>>>>>>在utils下面新建.my_page.py文件,名字隨便取
②:my_page.py文件內:將剛才的模板代碼粘貼進去
③:視圖文件views.py中:

def ttt(request):user_list = models.User.objects.all()all_count = user_list.count()current_page = request.GET.get('page', 1)page_obj = my_page.Pagination(current_page=current_page, all_count=all_count)page_queryset = user_list[page_obj.start:page_obj.end]return render(request, 'ttt.html', locals())

④:html文件中:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>圖書管理系統</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script><link rel="stylesheet" href="/static/layui/css/layui.css"><script src="/static/layui/layui.js"></script><script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script> </head> <body> <div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><table class="text-center table-bordered table table-hover table-striped"><thead><tr><th>ID</th><th>name</th><th>password</th></tr></thead><tbody>{% for user in page_queryset %}<tr><th>{{ user.pk }}</th><th>{{ user.name }}</th><th>{{ user.password }}</th></tr>{% endfor %}</tbody></table>{{ page_obj.page_html|safe }}</div></div> </div></body> </html>


演示結果:

總結

以上是生活随笔為你收集整理的Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。