Django高級(jí)(二):JavaScript Ajax

https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html

有時(shí)候我們想把一個(gè) list 或者 dict 傳遞給 javascript,處理后顯示到網(wǎng)頁(yè)上僧免,比如要用 js 進(jìn)行可視化的數(shù)據(jù)。

方法一:視圖函數(shù)渲染

直接在視圖函數(shù)(views.py中的函數(shù))中渲染一個(gè) list 或 dict 的內(nèi)容捏浊,和網(wǎng)頁(yè)其它部分一起顯示到網(wǎng)頁(yè)上(一次性地渲染懂衩,還是同一次請(qǐng)求)。

# ajax_test/urls.py
url(r'^home/$',views.home,name='ajax_test_home'),

#ajax_text/views.py
#coding:utf-8
from django.shortcuts import render
import json
# Create your views here.
def home(request):
    #List = ['My Djano', '渲染Json到模板']
    List = ['My Djano', 'Json']
    Dict = {'site': 'NGS_TEST', 'author': '蘇亞男'}
    return render(request, 'ajax_test/home.html',
    {'List': json.dumps(List),'Dict':json.dumps(Dict)})

# ajax_test/templates/ajax_test/home.html
{% extends 'learn/base.html' %}
{% block title %}歡迎光臨ajax_test首頁(yè){% endblock %}
{% block content %}
這里是首頁(yè)金踪,歡迎光臨!<br/>
<div id="list"> 學(xué)習(xí) </div>
<div id='dict'></div>
<script type="text/javascript">
//列表
    var List = {{ List|safe }};
    //下面的代碼把List的每一部分放到頭部和尾部
    $('#list').prepend(List[0]);
    $('#list').append(List[1]);

    console.log('--- 遍歷 List 方法 1 ---')
    for(i in List){
        console.log(i);// i為索引
    }

    console.log('--- 遍歷 List 方法 2 ---')
    for (var i = List.length - 1; i >= 0; i--) {
        // 鼠標(biāo)右鍵浊洞,審核元素,選擇 console 可以看到輸入的值胡岔。
        console.log(List[i]);
    };

    console.log('--- 同時(shí)遍歷索引和內(nèi)容法希,使用 jQuery.each() 方法 ---')
    $.each(List, function(index, item){
        console.log(index);
        console.log(item);
    });


// 字典
    var Dict = {{ Dict|safe }};
    console.log("--- 兩種字典的取值方式  ---")
    console.log(Dict['site']);
    console.log(Dict.author);

    console.log("---  遍歷字典  ---");
    for(i in Dict) {
        console.log(i + Dict[i]);//注意,此處 i 為鍵值
    }
</script>
{% endblock %}

# learn/templates/learn/base.html
<!DOCTYPE html>
<html>
<head>
    <title>
        {% block title %}NGS{% endblock %}
    </title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"> </script>
</head>

注:瀏覽器調(diào)試代碼
如果您的瀏覽器支持調(diào)試靶瘸,你可以使用 console.log() 方法在瀏覽器中顯示 JavaScript 值苫亦。瀏覽器中使用 F12 來(lái)啟用調(diào)試模式, 在調(diào)試窗口中點(diǎn)擊 "Console" 菜單怨咪。

方法二:Ajax再次請(qǐng)求

一屋剑,頁(yè)面加載完成后,在頁(yè)面上操作诗眨,在頁(yè)面上通過(guò) ajax 方法得到新的數(shù)據(jù)(再向服務(wù)器發(fā)送一次請(qǐng)求)并顯示在網(wǎng)頁(yè)上唉匾,這種情況適用于頁(yè)面不刷新的情況下,動(dòng)態(tài)加載一些內(nèi)容匠楚,比如用戶輸入一個(gè)值或者點(diǎn)擊某個(gè)地方巍膘,動(dòng)態(tài)地把相應(yīng)內(nèi)容顯示在網(wǎng)頁(yè)上厂财。

用 Django實(shí)現(xiàn)不刷新網(wǎng)頁(yè)的情況下加載一些內(nèi)容。
由于用 jQuery 實(shí)現(xiàn) ajax 比較簡(jiǎn)單峡懈,所以我們用 jQuery庫(kù)來(lái)實(shí)現(xiàn)璃饱,也可以用原生的 javascript 實(shí)現(xiàn)。這里舉例1拓展計(jì)算a+b逮诲,舉例2傳遞一個(gè)數(shù)組或字典到網(wǎng)頁(yè)帜平,由JS處理再顯示出來(lái)。

Demo1:加載字典和列表梅鹦,JSON格式傳遞數(shù)據(jù)

# ajax_test/urls.py
    url(r'^index/$',views.index,name='ajax_test_index'),
    url(r'^ajax_list/$', views.ajax_list, name='ajax-list'),
    url(r'^ajax_dict/$', views.ajax_dict, name='ajax-dict'),

# ajax_test/views.py
#coding:utf-8
import os
from django.shortcuts import render
from django.http import HttpResponse
import json
from django.http import JsonResponse
from suynblog import settings
# Create your views here.

def index(request):
    return render(request, 'ajax_test/index.html')
def ajax_list(request):
    a = range(100)
    #return HttpResponse(json.dumps(a),content_type='application/json')
    return JsonResponse(a, safe=False)
def ajax_dict(request):
    name_dict = {'suyn': 'Love python and Django', 'Miss Su': 'I am learning Django'}
    #return HttpResponse(json.dumps(name_dictm),content_type='application/json')
    return JsonResponse(name_dict)

# ajax_test/templates/ajax_test/index.html
<!DOCTYPE html>
<html>
<head>
      <title></title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"> </script>
</head>
<body>
<div id="dict">Ajax 加載字典</div>
<p id="dict_result"></p>

<div id="list">Ajax 加載列表</div>
<p id="list_result"></p>

<script>
    $(document).ready(function(){
        // 列表 list
        $('#list').click(function(){
            $.getJSON('{% url 'ajax_test:ajax-list' %}',function(ret){
                //返回值 ret 在這里是一個(gè)列表
                for (var i = ret.length - 1; i >= 0; i--) {
                    // 把 ret 的每一項(xiàng)顯示在網(wǎng)頁(yè)上
                    $('#list_result').append(' ' + ret[i])
                };
            })
        })

        // 字典 dict
        $('#dict').click(function(){
            $.getJSON('{% url 'ajax_test:ajax-dict' %}',function(ret){
                //返回值 ret 在這里是一個(gè)字典
                $('#dict_result').append(ret.suyn + '<br>');
                // 也可以用 ret['twz']
            })
        })
    });
</script>
</body>
</html>

Demo2:根據(jù)圖片名稱加載圖片裆甩,form請(qǐng)求

# ajax_test/urls.py
    url(r'^picIndex/$',views.picIndex),
    url(r'^get_pic/$', views.get_pic, name='get-pic'),

# ajax_test/views.py
#coding:utf-8
import os
from django.shortcuts import render
from django.http import HttpResponse
import json
from django.http import JsonResponse
from suynblog import settings
# Create your views here.

BASE_DIR = settings.BASE_DIR
print BASE_DIR  #/root/suyn_website/suynblog

PICS = os.listdir(os.path.join(BASE_DIR, 'common_static/pics'))
print PICS  #['DNA.jpg', 'desktop.jpg']

def picIndex(request):
    return render(request, 'ajax_test/pics.html')
def get_pic(request):
    color = request.GET.get('color')
    number = request.GET.get('number')
    name = '{}_{}'.format(color, number)

    # 過(guò)濾出符合要求的圖片,假設(shè)是以輸入的開(kāi)頭的都返回
    result_list = filter(lambda x: x.startswith(name), PICS)
    print 'result_list', result_list  #result_list ['red_1_2.png', 'red_11.png']
    # 去掉pics.html默認(rèn)的color number的value屬性齐唆,可以自己輸入嗤栓。result_list ['red_2.jpg']

    return HttpResponse(json.dumps(result_list),content_type='application/json')

# ajax_test/templates/ajax_test/pics.html
<!DOCTYPE html>
<html>
<head>
      <title></title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"> </script>
</head>
<body>
<p>請(qǐng)輸入</p>
<form action="{% url 'ajax_test:get-pic' %}" method="get">
    color: <input type="text" id="color" name="color" > <br>
    number: <input type="text" id="number" name="number" > <br>
    <p>result: <span id='result'></span></p>
    <button type="button" id='sum'>提交</button>
</form>
<script>
    $(document).ready(function(){
        $("#sum").click(function(){
            var color = $("#color").val();
            var number = $("#number").val();

            $.get("{% url 'ajax_test:get-pic' %}", {'color':color,'number':number}, function(ret){
                $('#result').html('') //清空前面的結(jié)果
                $.each(ret, function(index, item){
                    $('#result').append('![](/static/pics/'+item+')');
                })
            })
        });
    });
</script>

</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市箍邮,隨后出現(xiàn)的幾起案子茉帅,更是在濱河造成了極大的恐慌,老刑警劉巖锭弊,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堪澎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡味滞,警方通過(guò)查閱死者的電腦和手機(jī)樱蛤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剑鞍,“玉大人昨凡,你說(shuō)我怎么就攤上這事∫鲜穑” “怎么了便脊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)光戈。 經(jīng)常有香客問(wèn)我哪痰,道長(zhǎng),這世上最難降的妖魔是什么久妆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任妒御,我火速辦了婚禮,結(jié)果婚禮上镇饺,老公的妹妹穿的比我還像新娘乎莉。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布惋啃。 她就那樣靜靜地躺著哼鬓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪边灭。 梳的紋絲不亂的頭發(fā)上异希,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音绒瘦,去河邊找鬼称簿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惰帽,可吹牛的內(nèi)容都是我干的憨降。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼该酗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼授药!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起呜魄,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悔叽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后爵嗅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娇澎,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年睹晒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趟庄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡册招,死狀恐怖岔激,靈堂內(nèi)的尸體忽然破棺而出勒极,到底是詐尸還是另有隱情是掰,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布辱匿,位于F島的核電站键痛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匾七。R本人自食惡果不足惜絮短,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昨忆。 院中可真熱鬧丁频,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至奖磁,卻和暖如春改基,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咖为。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工秕狰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躁染。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓鸣哀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親褐啡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诺舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容