python测试开发django-24.表单提交之get请求

前言

通常我们需要在html页面上输入框里面输入数据,比如登录的时候,输入账号和密码,点提交按钮。
从html把数据提交到服务端,服务端接收数据后判断提交的数据,然后做出对应的响应,这么一整个流程就是表单相关的知识点,涉及到数据的交互。

form表单

表单在html中由<form>标签实现,一个完整的表单包含四个部分:提交地址、请求方式、元素控件、提交按钮,简单的html表单如下

  • action 提交地址,设置用户提交的数据由哪个url接收和处理
  • method 请求方式,get或post请求
  • input 元素控件, 输入文本信息
  • submit 提交按钮,触发提交动作
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>测试你的QQ号</title>
</head>
<body>
<p>请输入你的QQ号</p>

<form action="/result" method="get">
    qq: <input type="text" name="q"> <br>
    <br>
    <input type="submit" value="提交">
</form>

</body>
</html>

get请求提交

把上面的html报错为get_demo.html,放到templates目录下,views.py写个访问

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

# 测试QQ号访问页面
def test_qq(request):
    return render(request, 'get_demo.html')

# 提交后返回页面
def result_qq(request):
    return HttpResponse("提交成功!")

urls.py访问地址

from django.conf.urls import url
from django.urls import re_path, path
from hello import views

urlpatterns = [

    url(r'^qq/', views.test_qq),
    url(r'^result/', views.result_qq),
]

在浏览器输入http://localhost:8002/qq/,打开页面如下

输入QQ号点击提交,页面显示:提交成功!

获取提交参数(request.GET)

html上的数据提交后,我们希望能获取到提交的数据,然后对数据做个简单的处理,跟进不同的数据返回不同的结果。
我这里写个简单的案例,接收到用户提交的QQ号,对QQ号做个简单判断,奇数返回“大吉大利”,偶数返回“恭喜发财”

# views.py
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def test_qq(request):
    '''请求页面'''
    return render(request, 'get_demo.html')

def result_qq(request):
    '''返回结果'''
    if request.method == 'GET':
        # 获取提交的数据
        r = request.GET["q"]  # key就是前面输入框里的name属性对应值name="q"
        res = ""
        try:
            if int(r) %2:
                res = "大吉大利!"
            else:
                res = "恭喜发财!"
        except:
            res = "请输入正确QQ号!"

        return HttpResponse("测试结果:%s"%res)
    else:
        render(request, 'get_demo.html')

request.GET 可以看成一个字典,用GET方法传递的值都会保存到其中,可以用 request.GET[‘key_name‘]来取值,但是当key值不存在时,会报错“MultiValueDictKeyError”。

为了避免key值不存在时报错,这里可以用另外一种写法:request.GET.get(‘key_name‘, None)

# 获取提交的数据
# r = request.GET["q"] # key_name就是前面输入框里的name属性对应值name="q"
r = request.GET.get('q', None)  #key_name不存在时,不会报错

查询数据库返回

通常查询涉及到查询数据库,与数据库会有数据交互,接着前面的User库,通过输入用户名,查询到对应的emali地址,参考https://www.cnblogs.com/yoyoketang/p/10335212.html

实现功能:通过输入用户名称name值,查询到对应的email地址,测试数据如下

templates/name.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查询mail</title>
</head>
<body>
<form action="/email" method="get">
    输入用户名: <input type="text" name="name"> <br>

    <br>
    <input type="submit" value="提交">
</form>

<p>查询结果:{{email}} </p>
</body>
</html>

视图函数

# views.py

from django.shortcuts import render
from django.http import HttpResponse
from hello.models import User
# Create your views here.

def user_name(request):
    '''请求页面'''
    return render(request, 'name.html')

def user_mail(request):
    '''返回结果'''
    if request.method == 'GET':
        # 获取提交的数据
        # r = request.GET["q"] # key就是前面输入框里的name属性对应值name="q"
        n = request.GET.get('name', None)  # key不存在时不会报错
        res = ""
        res = User.objects.filter(user_name="%s" % n)
        try:
            res = res[0].mail
        except:
            res = "未查询到数据"
        return render(request, 'name.html', {'email': res})
    else:
        return render(request, 'name.html')

访问地址和返回地址

# urls.py
from django.conf.urls import url
from hello import views

urlpatterns = [
    # 新增用户
    url(r'^name/', views.user_name),
    url(r'^email/', views.user_mail),
]

html显示效果如下

原文地址:https://www.cnblogs.com/yoyoketang/p/10417479.html

时间: 2024-10-09 08:10:24

python测试开发django-24.表单提交之get请求的相关文章

UI标签库专题三:JEECG智能开发平台 FormValidation(表单提交及验证标签)

?? 1. FormValidation(表单提交及验证标签) 1.1.  参数 属性名 类型 描述 是否必须 默认值 action string 表单提交路径 否 null formid string 表单唯一标示 是 formobj refresh boolean dialog为true时是否刷新父页面 否 true callback string 表单提交完成后的回调函数 否 null beforeSubmit string 表单提交前的处理函数 否 null btnsub string

UI标签库专题三 JEECG智能开发平台 FormValidation 表单提交及验证标签

1. FormValidation(表单提交及验证标签) 1.1.  参数 属性名 类型 描述 是否必须 默认值 action string 表单提交路径 否 null formid string 表单唯一标示 是 formobj refresh boolean dialog为true时是否刷新父页面 否 true callback string 表单提交完成后的回调函数 否 null beforeSubmit string 表单提交前的处理函数 否 null btnsub string 触发表

泛微ecology8二次开发-关于流程表单提交校验

泛微流程表单里有个提交校验方法,是泛微预留的,为了方便开发人员遇到一些解决不了的事件.此方法是: checkCustomize = function() { return false: }); 方法里可写对某个对象的判断,如果符合就  return true: 否则return false:不让提交. 刚开始开发流程表单时,很多地方用到这个提交校验的方法,这时候需要注意: 1.有的流程表单,你只要写了这个方法,并且点击了提交按钮,此方法函数就会执行,执行完之后会校验模板中设置的字段必填项. 2.

python测试开发django-72.删除表后如何重新生成表

前言 在使用ORM建表的时候,由于需要对数据库表的重新设计,需要删除原表,并通过Django的ORM功能重新同步表. 删除表之后,发现用 makemigrations 和 migrate 无法生成新的表了. 遇到问题 当我新建一个 Model ,同步完数据库后,再修改里面的字段名称,发现无法同步到数据库,于是就把数据库里面的整张表删除了. 结果再同步数据库就无法生成新的表了,就算删除 migrations 目录下的0001_initial.py文件也一样. # 新建了一个PersonIn类,继承

python测试开发(06-前端[HTML,JS,CSS]+ajax请求)

1.HTML 略 2.JS var i = 0;while (i < 10) { console.log(i); i++;} for (var j = 0; j < 10; j++) { console.log(j)} // for in:遍历循环// 遍历数组var aList=Array( 11,22,33,44,55);for(i in aList){ console.log(i); //遍历数组的下标 console.log(aList[i]) //遍历数组的值} // 遍历对象:遍历

jqueryEasyUI form表单提交的一个困惑

今天用到了jqueryEasyUI的form表单做一个增加操作的提交,想打开调试(用的是火狐)看看传的参数,但是怎么也看不到form表单提交的http请求?而且还会发送一个另外的请求! 在页面加载时,会首先初始化一个datagrid,然后可以选择是否选择添加操作.另外发送的这个请求,就是这个datagrid想后台请求数据的请求.就相当与重新刷新了datagrid. datagrid请求数据库数据的操作写在$(function(){})里面,后来想想,是不是这个原因,jqueryEasyUI的fo

Servlet--超链接,表单提交,重定向,转发4种情况的路径

实际编码中我们常常写路径,写路径既能够写相对路径,也能够写绝对路径.我2年曾经我就养成了习惯.仅仅要是写路径我从来都是写绝对路径,由于万一将来我们的项目的文件夹发生变化.原来要是写相对路径的话就会有路径依赖关系.改的地方太多了.并且相对路径在某些情况下还有点特殊,有的是相对于原来的请求的文件夹,有的是相对于整个web应用,所以我强烈建议大家以后写路径统一用绝对路径(以"/"开头)来写,"/"表示网站的根路径. 写路径的情况无非以下4种情况,这里做一个整理. 1,超链

表单提交---前端页面模拟表单提交(form)

有些时候我们的前端页面总没有<form></form>表单,但是具体的业务时,我们又必须用表单提交才能达到我们想要的结果,LZ最近做了一些关于导出的一些功能,需要调用浏览器默认的下载功能,如果用ajax请求,则无法调用.所以只能用表单提交的方式请求后台方可调用浏览器默认的下载功能.这个时候我们只能自己手动添加<form></form>元素.这里LZ提供我自己遇到的两种情况: 一:在原有的html结构包上<form></form>标签,

Layui form表单提交注意事项

// 表单提交form.on('submit(first1)', function (data) { var articleFrom = data.field; $.ajax({ type:"POST", url:"/user/upDate", data:articleFrom, dataType:"JSON", success:function (data) { if(data.flag){ layer.closeAll(); } } });