Django学习系列10:保存用户输入——编写表单,发送POST请求
要获取用户输入的待办事项,发送给服务器,这样才能使用某种方式保存待办事项,然后在显示给用户查看。
上次运行测试指出无法保存用户的输入。现在,要使用HTML post请求。
若想让浏览器发送POST请求,要给<input>元素指定name=属性,然后把他放在<form>标签中,并为<form>标签指定method=POST属性,这样浏览器才能向服务器发送POST请求。
调整一下lists/templates/home.html中的模板
<html>
<head>
<title>To-Do lists</title>
</head>>
<body>
<h1>Your To-Do list</h1>
<form method="POST" action="">
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item" />
<input type="submit" value="ok">
</form> <table id="id_list_table"></table>
</body>
</html>
功能测试结果
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="id_list_table"]
为了找出问题
- 添加print语句,输出页面中当前显示的文本是什么?
- 改进错误信息,显示当前状态的更多信息
- 亲自手动访问网站
- 在测试执行过程中使用time.sleep暂停;
如果selenium运行的很慢,功能测试时就能看见如下图所示
错误信息中有CSRF(跨站请求伪造)漏洞。django针对CSRF的保护措施是在生成的每一个表单中放置一个自动生成的令牌,通过这个令牌判断POST请求是否来自一个网站。
之前的模板时是纯碎的HTML,在这里要首次体验Django模板的魔力,使用“模板标签”(template tag)添加CRSF令牌。
模板标签的句法是花括号和百分号形式,即{%…%}——这种写法很有名,要连续多次同时按两个键,是比较麻烦的输入方式。
<form method="POST" action="">
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item" />
{% csrf_tocken %}
</form>
渲染模板时,Django会把这个模板标签替换成一个<intput type='hidden'>元素,其值时CSRF令牌。现在运行功能测试,会看见一个预期失败
AssertionError: False is not true : New to-do item did not appear in table
因为time.sleep还在,所以测试会在最后一屏上暂停。可以看到,提交表单后新添加的待办事项不见了,页面刷新后又显示了一个空表单。这是因为还没连接服务器让它处理。
现在可以删掉time.sleep了。
Django学习系列10:保存用户输入——编写表单,发送POST请求的更多相关文章
- Django 学习第十天——状态保持及表单
状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 2.客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 3.存 ...
- Django学习系列5:为视图编写单元测试
打开lists/tests.py编写 """向浏览器返回真正的HTML响应,添加一个新的测试方法""" from django.test i ...
- Django学习系列之路由系统
一.基于App的路由 作用: 根据App对路由规则进行分类,在全局urls.py包含某个项目的urls.py 示例 定义全局urls.py(全局路由系统) #导入include from django ...
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- 不让input表单的输入框保存用户输入的历史记录
如何不让input表单的输入框保存用户输入的历史记录. 有时我们在设计网页时不想让表单保存用户输入历史记录,比如一些隐私数据,或一些冲值卡 <input name="test&quo ...
- js打印保存用户输入的内容
在用js打印局部页面时,遇到用户新输入的内容没能打印出来,经过观察,发现我采用的js打印方法是读取页面源代码,而用户输入的内容如果不将其写入到页面源代码中去,是打印不出来的,下面是我的解决方法: // ...
- Django学习系列9:接着修改首页
现在的功能测试还是失败的,继续修改代码,让其通过.因为HTML现在保存在模板中,可以尽情修改,无需编写额外的单元测试.我们需要一个<h1>元素 修改:lists/templates/hom ...
- 六、Django学习之基于下划线的跨表查询
六.Django学习之基于下划线的跨表查询 一对一 正向查询的例子为 已知用户名,查询用户的电话号码.反向查询例子反之. 正向查询 其中下划线前的表示表名,无下划线的表示的是Author表 resul ...
- Blazor和Vue对比学习(基础1.9):表单输入绑定和验证,VeeValidate和EditFrom
这是基础部分的最后一章,内容比较简单,算是为基础部分来个HappyEnding.我们分三个部分来学习: 表单输入绑定 Vue的表单验证:VeeValidate Blazor的表单验证:EditForm ...
随机推荐
- 创建podspec文件,为自己的项目添加pod支持
Cocoapods作为iOS开发的包管理器,给我们的开发带来了极大的便利,而且越来越多的第三方类库支持Pod,可以通过Pod傻瓜式的集成到自己的工程中,那么问题来了,我自己也有一系列的小工具类,怎么让 ...
- 【OpenJ_Bailian - 2790】迷宫(bfs)
-->迷宫 Descriptions: 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不 ...
- 【转载】mysql行列转换方法总结
[转载]mysql行列转换方法总结 [MySQL] 行列转换变化各种方法实现总结(行变列报表统计.列变行数据记录统计等) Mysql 列转行统计查询 .行转列统计查询 在某些数据库中有交叉表,但在My ...
- Metinfo5.1 /include/common.php 变量覆盖+SQL注入漏洞
- FTL2
ABSTACT 1.NAND flash memory (主要缺点): (1)partial page updates (2)general-purpose cache usually does n ...
- (5.11)mysql高可用系列——复制中常见的SQL与IO线程故障
关键词:mysql复制故障处理 [1]手工处理的gtid_next(SQL线程报错) 例如:主键冲突,表.数据库不存在,row模式下的数据不存在等. [1.1]模拟故障:GTID模式下的重复创建用户 ...
- 从零开始,SpreadJS 新人学习笔记
Hello,大家好,我是Fiona,从事前端开发工作,我十分热爱我的工作和一直默默栽培我的老板(这段请加粗). 前不久,接到老板的安排: 说实话,接到这个需求,我整个人的状态是这样的: 但是,我不能辜 ...
- Spring(十三)-- Spring 事务
Spring 事务 1. 回忆之前事务知识点 一:事务的概念 将一系列的数据操作捆绑在一起,成为一个整体进行统一管理! 一条或者多条sql语句的集合! 二:事务的ACID特性 原子性(Atomic ...
- Java中对象和引用的理解
偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆. 一.对象和引用的概念: 在Java中万 ...
- 平衡树(Splay、fhq Treap)
Splay Splay(伸展树)是一种二叉搜索树. 其复杂度为均摊\(O(n\log n)\),所以并不可以可持久化. Splay的核心操作有两个:rotate和splay. pushup: 上传信息 ...