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 ... 
随机推荐
- php register_shutdown_function响应error 配合error_get_last 捕获错误
			转自: http://blog.csdn.net/a757291228/article/details/62231125 //一个函数,用来响应 register_shutdown_function ... 
- 【Linux】常用基础命令
			修改时间 date -s 月/日/年 例如:date -s 07/31/2019 date -s 时:分:秒 例如:date -s 23:56:50 hwclock -w 将时间写到bois,防止重启 ... 
- ubuntu 16.04 server 扩容(LVM)磁盘
			因为发现我的本地server出现磁盘满了的情况 所以进行lvm的扩容 1 查看磁盘情况 df -h 原本发现 /dev/mapper/ubuntu1604--vg-root 这个磁盘满了 所以要进行扩 ... 
- 【并行计算-CUDA开发】Windows下opencl环境配置
			首先声明我这篇主要是根据下面网站的介绍, 加以修改和详细描述,一步一步在我自己的电脑上实现的, http://www.cmnsoft.com/wordpress/?tag=opencl&pag ... 
- java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken pipe
			今天公司技术支持的童鞋报告一个客户的服务不工作了,紧急求助,于是远程登陆上服务器排查问题. 查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但 ... 
- 最简单MySQL教程详解(基础篇)之多表联合查询
			在关系型数据库中,我们通常为了减少数据的冗余量将对数据表进行规范,将数据分割到不同的表中.当我们需要将这些数据重新合成一条时,就需要用到我们介绍来将要说到的表连接. 常用术语冗余(Redundancy ... 
- CentOS7下MySQL服务启动失败原因及解决方法
			在重启阿里的CentOS7服务器后,重启MySQL 出现错误 Starting mysqld (via systemctl): Job for mysqld.service failed becaus ... 
- 树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019
			题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ... 
- AppCan模拟器调试
			来源: 1, 页面CSS调试 2, JS调试 3, 插件请打包后手机调试 4, 打开另一个页面示例: appcan.button("#myBtn", "ani-uct&q ... 
- 简单的shell练习
			1.判断/etc/inittab文件是否大于100行,如果大于,则显示”/etc/inittab is a big file.”否者显示”/etc/inittab is a small file.”# ... 
