Django学习系列15:把POST请求中的数据存入数据库
要修改针对首页中的POST请求的测试。希望视图把新添加的待办事项存入数据库,而不是直接传给响应。
为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行新代码
# lists/tests.py
def test_can_save_a_post_request(self):
response = self.client.post('/', data={'item_text':'A new list item'})
self.assertEqual(Item.objects.count(), 1) #
new_item = Item.objects.first() #
self.assertEqual(new_item.text, 'A new list item') #
self.assertIn('A new list item', response.content.decode())
self.assertTemplateUsed(response, 'home.html')
代码解析:
1、检查是否把一个新Item对象存入数据库,objects.count()是objects.all().count()的简写形式
2、objects.first()等价于objects.all()[0]
3、检查待办事项的文本是否正确。
再次运行测试
self.assertEqual(Item.objects.count(), ) #
AssertionError: !=
修改一下视图
from django.shortcuts import render
from lists.models import Item
from django.http import HttpResponse # Create your views here.在这儿编写视图
def home_page(request):
item = Item()
item.text = request.POST.get('item_text', '')
item.save() return render(request, 'home.html', {
'new_item_text': request.POST.get('item_text', ''),
})
单元测试……通过了。
审视一下前面的代码,或许能发现一些明显的问题或需要注意的:
1、不要每次请求都保存空白的待办事项
2、post请求的测试太长
3、在表格中显示多个待办事项
4、支持多个清单!
代码重构
解决单元测试一次只测试一件事,在现有代码中添加一个断言,定义一个新的测试方法
# lists/tests.py class HomePageTest(TestCase):
【……】 def test_only_saves_items_when_necessary(self):
self.client.get('/')
self.assertEqual(Item.objects.count(), 0)
这个测试得到AssertionError: 1 != 0失败
下面来修正这个问题,注意,虽然对视图函数的逻辑改动幅度很小,但代码实现方式有细微的变动。
from django.shortcuts import render
from lists.models import Item
from django.http import HttpResponse # Create your views here.在这儿编写视图
def home_page(request):
if request.method == 'POST':
new_item_text = request.POST['item_text'] #
Item.objects.create(text=new_item_text) #
else:
new_item_text = '' # return render(request, 'home.html', {
'new_item_text': new_item_text, #
})
代码解析:
#1 使用名为 new_item_text的变量,其值是POST请求中的数据,或者空字符串。
#2 .objects.create()是创建新Item对象的简化方式,无需在调用.save()方法。
这样重构后测试通过
Django学习系列15:把POST请求中的数据存入数据库的更多相关文章
- SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- 【深度学习系列2】Mariana DNN多GPU数据并行框架
[深度学习系列2]Mariana DNN多GPU数据并行框架 本文是腾讯深度学习系列文章的第二篇,聚焦于腾讯深度学习平台Mariana中深度神经网络DNN的多GPU数据并行框架. 深度神经网络( ...
- 向post请求中写入数据,最终保存在了HttpWebRequest.Params中
一.向post请求中写入数据,最终保存在了HttpWebRequest.Params中: 1)如果存入的是IDictionary类型的字符串变量,如:“username=administrator”, ...
- java读取请求中body数据
java读取请求中body数据 /** * 获取request中body数据 * * @author lifq * * 2017年2月24日 下午2:29:06 * @throws IOExcepti ...
- 解决:HTML中多文本域(textarea)回车后数据存入数据库,EL表达式取出异常。
问题描述: 当多文本域(textarea)回车后数据存入数据库. EL表达式取出异常,值换行倒置页面报错. 问题解决: 存值脚本代码,提交前转换\n为<br/>. <script t ...
- Django学习系列11:在服务器中处理POST请求
之前的代码还没有为表单指定action=属性,因此提交表单默认返回之前渲染的页面,即“/”,这个由视图函数home_page处理.下面修改这个视图函数,让它能处理POST请求. 这意味着要为视图函数h ...
- Django学习系列12:把Python变量传入模板中渲染
从视图的Python代码中把变量传入HTML模板. 模板中使用哪种句法引入Python对象,要使用的符号{{...}},它会以字符串的形式显示对象: <html> <head> ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
随机推荐
- debian系统安装vsftpd服务端和ftp客户端
一.服务器安装和配置 1.安装vsftpd.(此处切换到su权限下了.其它用户请使用sudo权限,没有sudo权限的看前面的教程进行安装) apt-get install vsftpd 2.配置vsf ...
- 关于Yii的ocracle链接问题
1. http://www.yiiframework.com/extension/oci8pdo/ 2.下载extension包,根据配置可解决.
- Dapper 多表(三表以上)查询小技巧
在使用Dappr做查询的时候遇到多表查询,之前多是两张表,现在出现三张表或者更多.两表的时候使用splitOn进行分割,splitOn的默认值是Id.在我建库的时候,主键ID并不都是这个名字.当出现三 ...
- PJzhang:shell基础入门的2个疗程-two
猫宁!!! 第6节:重定向 标准输入,标准输出,错误输出 输入重定向符号'<' 输出重定向符号'>'(清空之后再输入),'>>'(当前内容不变,在最后一行追加),'2>' ...
- core python
一:正则表达式 闭包操作符 | 等同于 or exp:a|b|c . 匹配任意一个字符 (若匹配本字符,需转义使用 \. 不能匹配换行符\n及空字符串) (^:匹配首 ...
- String的非空判断:str!=""的为空判断出错问题
if(str!=null && str!= ""){}这是错误的判断 String str1 = ""; String str2 = new S ...
- Solve the Equation
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
- sql server之批量数据导入
实际应用场景中,有时会需要把一批数据导入数据库.这批数据可能来源于另一个数据源.比较常规的做法是先读取到dataset,然后跑一个循环,每一行拼一句insert into语句,执行之.用过的人会知道, ...
- node.js中的url.parse方法使用说明
node.js中的url.parse方法使用说明:https://blog.csdn.net/swimming_in_it_/article/details/77439975 版权声明:本文为博主原创 ...
- HTTPS原理(三次握手)
第一步: 客户端向服务器发送HTTPS请求,服务器将公钥以证书的形式发送到客户端(服务器端存放私钥和公钥). 第二步: 浏览器生成一串随机数,然后用公钥对随机数和hash签名进行加密,加密后发送给服务 ...