1. 程式人生 > >django下使用ajax實現點選與翻頁功能

django下使用ajax實現點選與翻頁功能

ajax是一種用於建立快速動態網頁的技術。通過在後臺與伺服器進行少量資料交換,ajax可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。傳統的網頁如果需要更新內容,就必須過載整個頁面。下面就介紹一下在django框架中怎樣使用ajax實現點選事件與內容翻頁功能。

準備工作

django專案需要建立好,jQuery檔案需要下載並放到django專案的static檔案中,模板也需要建立好。那麼下面我們就可以開始了。

操作

我們需要先新增輸入框,按鈕,ajax請求成功後資料返回後所放的位置,上一頁下一頁按鈕所放位置。

#style樣式可以忽略,對整個功能方面沒影響
<input type="text" class="form-control" name="content" id="content" placeholder="Search for..." style="width: 400px;height:40px;right: 130px;top: 15px;background: #000000;color: #eeeeee;border-radius: 6px">

<button class="btn btn-default" id="search" type="button" style="top: 30px;right: 180px;border-radius: 6px">搜尋</button>

#放置資料
<div id="search_content"></div>

#放置上一頁,下一頁按鈕
<nav class="navbar navbar-default navbar-fixed-bottom" id="nav_btn" style="left:700px;right: 580px;background: #ffffff;margin: 0;padding: 0"></nav>

接下來匯入jquery檔案。

#django中模板引擎使用方法,不懂的可以查詢一下,此處不進行解釋
{% load static %}
<script type="text/javascript" src="{% static 'js/jquery-3.3.1.min.js' %}"></script>

新增點選事件。此處ajax使用get請求,url代表請求的地址,data為要向url所傳送的資料,success為傳送成功後執行的程式,此處使用一個函式來進行處理。

<script type="text/javascript">

    $(document).ready(function(){
            {# 搜尋按鈕點選事件 #}
            $('#search').click(function () {
                $.ajax({
                    type: 'GET',
                    url: 'http://127.0.0.1:8000/info/zhilian_search/',
                    data:{"content":$("#content").val(),"page":0},
                    success:function (results) {
                        render(results)
                    }
                });

            });

        });

</script>

ajax成功後執行的函式,這個函式功能是拼接表格,將返回的資料與樣式拼接後返回給前端。

            {# 拼接網頁 #}
            function render(results) {

                var html = '<table class="table table-striped table-hover"><tr class="success"><td>職位</td><td>工資</td><td>地點</td><td>經驗</td><td>學歷</td><td>要求</td></tr>';
                for (var i = 0; i < results['records'].length; i++) {
                    var record = results['records'][i];
                    html += '<tr>';
                    html += '<td>'+record['job_title']+'</td>';
                    html += '<td>'+record['job_salary']+'</td>';
                    html += '<td>'+record['job_address']+'</td>';
                    html += '<td>'+record['job_experience']+'</td>';
                    html += '<td>'+record['job_education']+'</td>';
                    html += '<td>'+record['job_content']+'</td>';
                }
                $('#search_content').html(html+"</table>");
               
            }

下面我們看一下view.py。

from django.shortcuts import render
from zhilian.models import Information
from django.db.models import Q
from django.http import JsonResponse


def zhilian_search(request):    
    try:
        content = request.GET['content']

    except:
        content=None

    request.session['content'] = content
    infos = Information.objects.filter(Q(job_content__icontains = request.session.get('content')))
    info_list = []
    for i in range(len(infos)):
        info_list.append({"job_title":infos[i].job_title,
                          "job_salary":infos[i].job_salary,
                          "job_address":infos[i].job_address,
                          "job_experience":infos[i].job_experience,
                          "job_education":infos[i].job_education,
                          "job_content":infos[i].job_content[0:50]+'....',})
return JsonResponse({"records":info_list})

如果你看到了此處,那麼現在ajax非同步請求已經完成了。但是如果你還想要了解分頁功能,那麼還沒有結束。

在前端頁面中新增上一頁、下一頁與搜尋函式。

            {# 上一頁 #}
            function previous(page) {
                page = page-1;
                search(page);
            }
            {# 下一頁 #}
            function next(page) {
                page = page +1;
                search(page);
            }
            {# 搜尋,與按鈕點選事件中函式的完全相同 #}
            function search(page) {
                $.ajax({
                    type: 'GET',
                    url: 'http://127.0.0.1:8000/info/zhilian_search/',
                    data:{"content":$("#content").val(),"page":page},
                    success:function (results) {
                        render(results)
                    }
                });
            }

render函式我們也需要改一改。

            {# 拼接網頁 #}
            function render(results) {

                var html = '<table class="table table-striped table-hover"><tr class="success"><td>職位</td><td>工資</td><td>地點</td><td>經驗</td><td>學歷</td><td>要求</td></tr>';
                for (var i = 0; i < results['records'].length; i++) {
                    var record = results['records'][i];
                    html += '<tr>';
                    html += '<td>'+record['job_title']+'</td>';
                    html += '<td>'+record['job_salary']+'</td>';
                    html += '<td>'+record['job_address']+'</td>';
                    html += '<td>'+record['job_experience']+'</td>';
                    html += '<td>'+record['job_education']+'</td>';
                    html += '<td>'+record['job_content']+'</td>';
                }
                $('#search_content').html(html+"</table>");
                {# 上一頁,下一頁 #}
                html = '<div class="container">';
                if (results['pages']>1){
                    if (results['page']>0){
                        html += '<a id="previous" href="javascript:void(0)" style="background: #000000;color:#ffffff" class="btn btn-default" onmouseover="this.style.background='+"'#ffffff';this.style.color="+"'#000000'"+'" onmouseout="this.style.background='+"'#000000';this.style.color="+"'#ffffff'"+'"  onclick="previous('+results["page"]+')">上一頁</a>'
                    }
                    else {
                        html += '<a id="previous" href="javascript:void(0)" class="btn btn-default disabled" onclick="previous('+results["page"]+')">上一頁</a>'
                    }

                    if (results['page']+1<results['pages']){
                        html += '<a id="next" href="javascript:void(0)"  class="btn btn-default" onmouseover="this.style.background='+"'#000000';this.style.color="+"'#ffffff'"+'" onmouseout="this.style.background='+"'#ffffff';this.style.color="+"'#000000'"+'" onclick="next('+results["page"]+')">下一頁</a></div>';
                     }
                    else {
                        html += '<a id="next" href="javascript:void(0)"  class="btn btn-default disabled" onclick="next('+results["page"]+')">下一頁</a></div>';
                     }
                }
                $("#nav_btn").html(html);
            }

此刻,前端頁面已經大功告成了,我們下面只需再修改一下views.py中的程式碼就可以了。

#各種包見上面程式碼,此處不再重複寫了

def zhilian_search(request):

    try:
        content = request.GET['content']
    except:
        content=None
    request.session['content'] = content

    try:
        page = request.GET['page']
        page = int(page)
    except:
        page = 0
    infos = Information.objects.filter(Q(job_content__icontains = request.session.get('content')))

    pages = math.ceil(len(infos)/10)

    info_list = []
    try:
        for i in range(10):
            info_list.append({"job_title":infos[page*10+i].job_title,
                          "job_salary":infos[page*10+i].job_salary,
                          "job_address":infos[page*10+i].job_address,
                          "job_experience":infos[page*10+i].job_experience,
                          "job_education":infos[page*10+i].job_education,
                          "job_content":infos[page*10+i].job_content[0:50]+'....',})
    except:
        info_list = []
        for i in range(len(infos)%10):
            info_list.append({"job_title": infos[page * 10 + i].job_title,
                              "job_salary": infos[page * 10 + i].job_salary,
                              "job_address": infos[page * 10 + i].job_address,
                              "job_experience": infos[page * 10 + i].job_experience,
                              "job_education": infos[page * 10 + i].job_education,
                              "job_content": infos[page * 10 + i].job_content[0:50] + '....', })

    return JsonResponse({"records":info_list,"page":page,"pages":pages})

大功告成了!啟動伺服器後,你就可以使用ajax方式進行點選搜尋與翻頁了。