Django MVC與MTV概念 Ajax、分頁實現

 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)
View Code

 

前端

 

<!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())
相關文章
相關標籤/搜索