Django—Ajax请求【get,post】

Django—Ajax请求【get,post】

初步介绍

Ajax 介绍:AsynchronousJavascript and XML【异步的JavaScript和xml】。

普通请求,会携带整个页面提交,最明显的特征是刷新页面,并且请求可能阻塞整个服务。这样导致:①请求内容和响应内容冗余,②用户体验特别差。

基于以上的问题,后来出现了ajax请求。

1、ajax可以发起局部请求,页面整体可以不刷新,只是页面的局部刷新。

2、Ajax可以发起异步请求,请求的过程当中不会阻塞web正常操作和访问。

Ajax的兴起得益于Google公司的推广,Google公司在本公司大量的项目当中使用了ajax。这件事儿让微软公司感觉很尴尬,在1997年,微软公司就发明了ajax核心技术,1999年微软的ie5浏览器就开始兼容ajax对象(xmlhttpRequest),微软公司在后来就将ajax技术搁置了。

Ajax需要js语法进行编写,原生js的ajax比较复杂,因为各种浏览器对ajax对象的兼容是不一样的,使用js写ajax,首先要完成的是各种浏览器的ajax实例创建。比较繁复,所有我们通常用jq封装过的ajax。

Ajax get请求:需要一个页面,但是需要两个视图。

第一个视图只是负责生产ajax请求的页面:

第二个视图是为了处理ajax请求的视图,通常返回json,不返回页面

get

第一个视图
def ajax_get(request):
    return render_to_response('ajax_get.html')
第二个视图
from django.http import JsonResponse
def ajax_get_data(request):
    result = {"status":"error","content":""} # 初始化一个返回结果的格式
    username = request.GET.get('username') # 获取Ajax,get请求过来的username
    if username:# 用户名不为空
        user = FromExample.objects.filter(name=username).first() # 进行数据库查询
        if user: # 如果有结果,证明用户名被使用
            result['content'] = '用户名重复'
        else: # 证明用户名没有被使用
            result['status'] = "success"
            result['content'] = '用户名可以使用'
    else: # 如果用户名为空
        result['content'] = '用户名不可以为空'
    return JsonResponse(result)

页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/js/jquery.min.js"></script>
</head>
<body>
    <input id="username" type="text">
    <button id="valid" type="button">校验</button>
    <span id="ts" style="color: red"></span>
    <script>
        $('#valid').click(
           function () {
                var username = $('#username').val(); //获取输入的用户名
                var url = '/agd/?username='+username; //拼接url
                $.ajax( //发起Ajax请求,是jq.Ajax的固定格式
                    { // Ajax配置项必须在一个对象(字典)当中
                        url: url, // 请求的路由
                        type: "get", // 请求的类型
                        data:"", // 请求携带的参数
                        success:function (data) { // 请求成功的数据
                            var content = data.content;
                            $('#ts').text(content)
                        },
                        error: function (error) { // 请求失败的数据
                            console.log(error)
                        }
                    }
                )
            }
        )
    </script>
</body>
</html>

post

第一个视图
def ajax_post(request):
    userForm = UserForm()
    return render(request,'ajax_post.html',locals())
第二个视图
from django.http import JsonResponse
def ajax_post_data(request):
    result = {'status':'error','content':'请求过来了'}
    if request.method == 'POST':
        data = UserForm(request.POST) #将post请求的数据传递给UserForm进行校验
        if data.is_valid(): #如果校验成功,返回true
            clean_data = data.cleaned_data #返回一个放着校验过的数据的字典
            user = UserModel()
            user.username = clean_data.get('username')
            user.password = clean_data.get('password')
            user.age = clean_data.get('age')
            user.email = clean_data.get('email')
            user.birthday = clean_data.get('birthday')
            user.save()
            result['status'] = 'success'
            result['content'] = '数据库保存成功'
        else:
            result['content'] = '<br>'.join(data.errors.values) # 连接字符串
    else:
        result['content'] = '请求类型错误'
    return JsonResponse(result)
页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        li{
            list-style: none;
        }
        *{
            font-size: 32px;
        }
        .errorlist{
            color: red;
            font-size: 24px;
        }
    </style>
    <script src="/static/js/jquery.min.js"></script>
</head>
<body>
    <form class="register_form">
        {% csrf_token %}
        {% for u in userForm %}
        <p>
            <label>{{ u.label }}</label>
            {{ u }}
        </p>
        {% endfor %}
        <p>
            <input id="submit" type="button" value="提交">
        </p>
    </form>

    <script>
        $("#submit").click(
            function () {
                // 收集数据
                var username = $('#id_username').val();
                var password = $('#id_password').val();
                var age = $('#id_age').val();
                var email = $('#id_email').val();
                var birthday = $('#id_birthday').val();
                var csrfmiddlewaretoken = '{{ csrf_token }}';
                // csrfmiddlewaretoken 为固定的,不可更改
                send_data = {
                    'username' : username,
                    'password' : password,
                    'age' : age,
                    'email' : email,
                    'birthday' : birthday,
                    "csrfmiddlewaretoken": csrfmiddlewaretoken,
                };
                console.log(send_data);
                var url = '/apd/';  // 编写请求的url
                $.ajax(
                    {
                        url: url,
                        type: 'POST',
                        data: send_data,
                        success: function (data) {
                            console.log(data)
                        },
                        error: function (error) {
                            console.log(error)
                        }
                    }
                )
            }
        )
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值