Python之路64-Ajax

目录

一、Ajax提交表单

二、Ajax提交表单升级版

三、一些使用的注意事项



一、Ajax提交表单

Ajax提交表单,获取标签数据后将数据提交给后台,后台做出判断,完后返回值,Ajax接收到返回值执行回调函数,根据返回值的不同做不同的操作

默认form提交会刷新页面,而Ajax提交不会刷新页面,而是根据后台返回信息来做进一步操作


urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^business$‘, views.business),
    url(r‘^host$‘, views.host),
    url(r‘^test_ajax$‘, views.test_ajax),
]

views.py

def test_ajax(request):
    h = request.POST.get("hostname")
    i = request.POST.get("ip")
    p = request.POST.get("port")
    b = request.POST.get("b_id")
    if h and len(h) > 5:
        models.Host.objects.create(hostname=h,
                                   ip=i,
                                   port=p,
                                   # b=models.Business.objects.get(id=b),
                                   b_id=b)
        return HttpResponse("OK")
    else:
        return HttpResponse("太短了")

host.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .hide{
            display: none;
        }
        .shade{
            position: fixed;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background-color: black;
            opacity: 0.6;
            z-index: 5;
        }
        .add-model{
            position: fixed;
            height: 300px;
            width: 400px;
            top: 50%;
            left: 50%;
            margin-top: -150px;
            margin-left: -200px;
            background-color: white;
            border: 1px solid red;
            z-index: 10;
        }
    </style>
</head>
<body>
    <h1>主机列表(对象)</h1>
    <div>
        <input id="add_host" type="button" value="添加"/>
    </div>
    <table border="1">
        <thead>
            <tr>
                <th>序号</th>
                <th>主机名</th>
                <th>IP</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v1 %}
                <tr hid="{{ row.nid }}" bid="{{ row.b_id }}">
                    <td>{{ forloop.counter }}</td>
                    <td>{{ row.hostname }}</td>
                    <td>{{ row.ip }}</td>
                    <td>{{ row.port }}</td>
                    <td>{{ row.b.caption }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>

    <h1>主机列表(字典)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v2 %}
                <tr hid="{{ row.nid }}" bid="{{ row.b_id }}">
                    <td>{{ row.hostname }}</td>
                    <td>{{ row.b__caption }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>

    <h1>主机列表(元祖)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v3 %}
                <tr hid="{{ row.0 }}" bid="{{ row.2 }}">
                    <td>{{ row.1 }}</td>
                    <td>{{ row.3 }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    <div class="shade hide"></div>
    <div class="add-model hide">
        <form action="/host" method="POST">
            <div class="group">
            <input id="host" type="text" placeholder="主机名" name="hostname" />
            </div>
            <div class="group">
                <input id="ip" type="text" placeholder="IP" name="ip" />
            </div>
            <div class="group">
                <input id="port" type="text" placeholder="端口" name="port" />
            </div>
            <div class="group">
                <select id="sel" name="b_id">
                    {% for op in b_list %}
                        <option value="{{ op.id }}">{{ op.caption }}</option>
                    {% endfor %}
                </select>
            </div>
            <input type="submit" value="提交">
            <a id="ajax_submit" style="display: inline-block;padding: 5px; background-color: blue;color: white">悄悄提交</a>
            <input id="cancel" type="button" value="取消">
        </form>
    </div>
    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        $(function () {
            $("#add_host").click(function () {
                $(".shade,.add-model").removeClass("hide");

            });
        });
        $(function () {
            $("#cancel").click(function () {
                $(".shade,.add-model").addClass("hide");
            });
        });

        $(function () {
            $("#ajax_submit").click(function () {
                $.ajax({
                    url: "/test_ajax",
                    type: "POST",
                    data: {"hostname": $("#host").val(), "ip": $("#ip").val(), "port": $("#port").val(), "b_id": $("#sel").val()},
                    success: function (data) {
                        if(data == "OK"){
                            location.reload();
                        }else{
                            alert(data);
                        }
                    }
                });
            });
        });
    </script>
</body>
</html>


二、Ajax提交表单升级版

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^business$‘, views.business),
    url(r‘^host$‘, views.host),
    url(r‘^test_ajax$‘, views.test_ajax),
]

views.py

def test_ajax(request):
    import json
    ret = {"status": True, "error": None, "data": None}
    try:
        h = request.POST.get("hostname")
        i = request.POST.get("ip")
        p = request.POST.get("port")
        b = request.POST.get("b_id")
        if h and len(h) > 5:
            models.Host.objects.create(hostname=h,
                                       ip=i,
                                       port=p,
                                       # b=models.Business.objects.get(id=b),
                                       b_id=b)
        else:
            ret["status"] = False
            ret["error"] = "太短了"
    except Exception as e:
        ret["status"] = False
        ret["error"] = "请求错误"
    return HttpResponse(json.dumps(ret))

host.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .hide{
            display: none;
        }
        .shade{
            position: fixed;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background-color: black;
            opacity: 0.6;
            z-index: 5;
        }
        .add-model{
            position: fixed;
            height: 300px;
            width: 400px;
            top: 50%;
            left: 50%;
            margin-top: -150px;
            margin-left: -200px;
            background-color: white;
            border: 1px solid red;
            z-index: 10;
        }
    </style>
</head>
<body>
    <h1>主机列表(对象)</h1>
    <div>
        <input id="add_host" type="button" value="添加"/>
    </div>
    <table border="1">
        <thead>
            <tr>
                <th>序号</th>
                <th>主机名</th>
                <th>IP</th>
                <th>端口</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v1 %}
                <tr hid="{{ row.nid }}" bid="{{ row.b_id }}">
                    <td>{{ forloop.counter }}</td>
                    <td>{{ row.hostname }}</td>
                    <td>{{ row.ip }}</td>
                    <td>{{ row.port }}</td>
                    <td>{{ row.b.caption }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>

    <h1>主机列表(字典)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v2 %}
                <tr hid="{{ row.nid }}" bid="{{ row.b_id }}">
                    <td>{{ row.hostname }}</td>
                    <td>{{ row.b__caption }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>

    <h1>主机列表(元祖)</h1>
    <table border="1">
        <thead>
            <tr>
                <th>主机名</th>
                <th>业务线名称</th>
            </tr>
        </thead>
        <tbody>
            {% for row in v3 %}
                <tr hid="{{ row.0 }}" bid="{{ row.2 }}">
                    <td>{{ row.1 }}</td>
                    <td>{{ row.3 }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    <div class="shade hide"></div>
    <div class="add-model hide">
        <form action="/host" method="POST">
            <div class="group">
            <input id="host" type="text" placeholder="主机名" name="hostname" />
            </div>
            <div class="group">
                <input id="ip" type="text" placeholder="IP" name="ip" />
            </div>
            <div class="group">
                <input id="port" type="text" placeholder="端口" name="port" />
            </div>
            <div class="group">
                <select id="sel" name="b_id">
                    {% for op in b_list %}
                        <option value="{{ op.id }}">{{ op.caption }}</option>
                    {% endfor %}
                </select>
            </div>
            <input type="submit" value="提交">
            <a id="ajax_submit" style="display: inline-block;padding: 5px; background-color: blue;color: white">悄悄提交</a>
            <input id="cancel" type="button" value="取消">
            <span id="error_msg"></span>
        </form>
    </div>
    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        $(function () {
            $("#add_host").click(function () {
                $(".shade,.add-model").removeClass("hide");

            });
        });
        $(function () {
            $("#cancel").click(function () {
                $(".shade,.add-model").addClass("hide");
            });
        });

        $(function () {
            $("#ajax_submit").click(function () {
                $.ajax({
                    url: "/test_ajax",
                    type: "POST",
                    data: {"hostname": $("#host").val(), "ip": $("#ip").val(), "port": $("#port").val(), "b_id": $("#sel").val()},
                    success: function (data) {
                        var obj = JSON.parse(data);
                        if(obj.status){
                            location.reload();
                        }else{
                            $("#error_msg").text(obj.error);
                        }
                    }
                });
            });
        });
    </script>
</body>
</html>


三、一些使用的注意事项


1.基本使用

$.ajax({
    url: "/host",
    type: "POST",
    data: {"k1": 123, "k2": "root"},
    success: function(data){

    }
})

get封装了$.ajax(),type为get
$.get(url="xxx", data={}, success=function(data){

});

get封装了$.ajax(),type为post
$.post(url="xxx", data={}, success=function(data){

});

2.永远让服务器返回一个字典

return HttpResponse(json.dumps(字典))

3.前端接收到json数据

可以用JSON.parse(data),将字符串转换成对象

取对象中的值的时候,可以用.来取(json)

时间: 2024-11-03 06:16:26

Python之路64-Ajax的相关文章

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路【第十八篇】:Web框架们

Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路

Python之路【第十七篇】:Django【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

七日Python之路--第九天

众所周知,代码这东西不是看出来的.程序这东西只哟一个标准. 下面找点开源的东西看看,学习一下大婶们的犀利编码...... 推荐一下: 虽然有点老了:http://www.iteye.com/topic/405150,还有就是GitHub上面搜索一下Django就能出来很多,当然还有OSChina.只是有个问题,就是Django版本不同,具体的内容可能会有些不同,但大概还是相同的.领略即可,然后书写自己的代码. 首要的还是官方文档. 看着还是有些难度的.偶然发现一个不错的Blog:http://w

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路_Day12

Python之路_Day12_课堂笔记 上节回顾 一.线程 线程 基本线程使用 队列-消息队列 线程池 进程 基本使用 进程数据共享 进程池 协程 更适用IO操作 二.Memcache.Redis Memcache 集群: (C1,1) (C2,2) (C3,1) [C1,C2,C2,C3] gets/cas Redis 一. 默认支持连接池 支持事务 发布和订阅 二.Redis基本操作 三.自定义 Redis列表类型 默认全部取 根据索引取值 本节预告 一.线程池 二.redis,发布订阅 三

Python之路,Day18 - 开发一个WEB聊天来撩妹吧

Python之路,Day18 - 开发一个WEB聊天来撩妹吧 本节内容: 项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个群有管理员可以审批用户的加群请求,群管理员可以用多个,群管理员可以删除.添加.禁言群友 可以与聊天室里的人进行临时会话(与qq群一样) 可以在群中发图片 可以与好友一对一发文件 知识必备: django html\css\js bootstrap jquery, ajax 前景介绍 首先我们知道http

python之路,Day24 常用设计模式学习

python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一