Django中使用Ajax

Ajax 全称是Asynchronous JavaScript and XML,即异步JavaScript和XML,是指创建一种交互式网页应用的网页开发技术。

一般的网页(即不使用ajax技术的网页),如果需要更新某些内容,需要重新加载整个页面。而应用了ajax技术之后,可以在不重新加载整个整个页面的情况下,通过后台加载数据,并在页面上显示。

jquery的存在,使得实现ajax技术变得很容易,基本用法: $.ajax(url,setting) 该方法会返回一个XMLHttpRequest对象。

URL:必选的,是希望请求数据的URL。
setting是可选的,里面有很多的选项,用于配置 Ajax 请求的键值对集合。

列出几个重要的参数:

1、async

类型:Boolean
默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。
注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。

2、data

类型:String
发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。

3、dataType

类型:String
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
"text": 返回纯文本字符串

4、success

类型:Function
请求成功后的回调函数。
参数:由服务器返回,并根据 dataType 参数进行处理后的数据;描述状态的字符串。
这是一个 Ajax 事件。

5、xhr

类型:Function
需要返回一个 XMLHttpRequest 对象。默认在 IE 下是 ActiveXObject 而其他情况下是 XMLHttpRequest 。用于重写或者提供一个增强的 XMLHttpRequest 对象。这个参数在 jQuery 1.3 以前不可用。

默认情况下,Ajax 请求使用 GET 方法。如果要使用 POST 方法,可以设定 type 参数值。这个选项也会影响 data 选项中的内容如何发送到服务器。

data 选项既可以包含一个查询字符串,比如 key1=value1&key2=value2 ,也可以是一个映射,比如 {key1: 'value1', key2: 'value2'} 。如果使用了后者的形式,则数据再发送器会被转换成查询字符串。这个处理过程也可以通过设置 processData 选项为 false 来回避。如果我们希望发送一个 XML 对象给服务器时,这种处理可能并不合适。并且在这种情况下,我们也应当改变 contentType 选项的值,用其他合适的 MIME 类型来取代默认的 application/x-www-form-urlencoded 。

上面是最基本的加载数据方法,但可以使用更简单的方法,如$.get,$.post,$.getJSON等等。

$.getJSON用于通过HTTP GET请求获得JSON数据,并输出结果。 用法:jQuery.getJSON(url,data,func),当数据返回之后,就会调用给定的func。 等同于:

$.ajax({
  url: url,
  data: data,
  success: callback,
  dataType: json
});

在Django项目中,我就用该方法请求json数据。

实际例子:

在JS脚本中定义:

<script type="text/javascript">
$(function() {
function submit_form(e) {
    $.getJSON('/dashboard/testajax/',
    function(result) {
        $('#linecontainer').highcharts({
            title: {
                text: '文章统计',
                x: -20 //center
            },
            subtitle: {
                text: '统计月发表文章数',
                x: -20
            },
            xAxis: {
                categories: result.months
            },
            yAxis: {
                title: {
                    text: '篇'
                },
                plotLines: [{
                    value: 0,
                    width: 1,
                    color: '#808080'
                }]
            },
            tooltip: {
                valueSuffix: '篇'
            },
            legend: {
                layout: 'vertical',
                align: 'right',
                verticalAlign: 'middle',
                borderWidth: 0
            },
            series: [{
                name: '文章数',
                data: result.count
            }
            ]
        });
    });

}
submit_form();

});

$.getJSON首先请求我的应用URL,http://hbnnlove.sinaapp.com/api/testajax. 当成功返回json数据后,就会调用函数:

$('#linecontainer').highcharts({})在id=linecontainer处会highchart图形。

视图函数:

def uidarticles(request):
    uid = request.user.id
    article_list =  Article.objects.filter(author=uid,status=0).order_by('pub_time')
    xAxis = ['2016-01', '2016-02', '2016-03', '2016-04', '2016-05',
             '2016-06','2016-07', '2016-08', '2016-09', '2016-10', '2016-11', '2016-12']
    months = list(set(map(lambda x:x.pub_time.strftime('%Y-%m'),article_list)))
    count =[]
    for month in xAxis:
        if month not in months:
            count.append(0)
            continue
        single_month_data = filter(lambda x:x.pub_time.strftime('%Y-%m')==month,article_list)
        sum = len(single_month_data)
        count.append(sum)
    current_month = datetime.date.today().strftime('%Y-%m')

    return JsonResponse({'months':xAxis,'count':count})

效果图:

--------EOF---------
微信分享/微信扫码阅读