要修改针对首页中的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请求中的数据存入数据库的更多相关文章

  1. SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...

  2. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  3. 【深度学习系列2】Mariana DNN多GPU数据并行框架

    [深度学习系列2]Mariana DNN多GPU数据并行框架  本文是腾讯深度学习系列文章的第二篇,聚焦于腾讯深度学习平台Mariana中深度神经网络DNN的多GPU数据并行框架.   深度神经网络( ...

  4. 向post请求中写入数据,最终保存在了HttpWebRequest.Params中

    一.向post请求中写入数据,最终保存在了HttpWebRequest.Params中: 1)如果存入的是IDictionary类型的字符串变量,如:“username=administrator”, ...

  5. java读取请求中body数据

    java读取请求中body数据 /** * 获取request中body数据 * * @author lifq * * 2017年2月24日 下午2:29:06 * @throws IOExcepti ...

  6. 解决:HTML中多文本域(textarea)回车后数据存入数据库,EL表达式取出异常。

    问题描述: 当多文本域(textarea)回车后数据存入数据库. EL表达式取出异常,值换行倒置页面报错. 问题解决: 存值脚本代码,提交前转换\n为<br/>. <script t ...

  7. Django学习系列11:在服务器中处理POST请求

    之前的代码还没有为表单指定action=属性,因此提交表单默认返回之前渲染的页面,即“/”,这个由视图函数home_page处理.下面修改这个视图函数,让它能处理POST请求. 这意味着要为视图函数h ...

  8. Django学习系列12:把Python变量传入模板中渲染

    从视图的Python代码中把变量传入HTML模板. 模板中使用哪种句法引入Python对象,要使用的符号{{...}},它会以字符串的形式显示对象: <html> <head> ...

  9. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

随机推荐

  1. 使用第三方UITableView+FDTemplateLayoutCell计算cell行高注意点

    现在很方便的计算单元格的行高大部分都是使用的第三方框架UITableView+FDTemplateLayoutCell,不知道你在使用这个框架的时候有没有遇到和我一样的问题,比如: 在这样计算cell ...

  2. C基础知识(11):错误处理

    C语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据.在发生错误时,大多数的C或UNIX函数调用返回1或NULL,同时会设置一个错误代码errno,该错误代码 ...

  3. Dapper 多表(三表以上)查询小技巧

    在使用Dappr做查询的时候遇到多表查询,之前多是两张表,现在出现三张表或者更多.两表的时候使用splitOn进行分割,splitOn的默认值是Id.在我建库的时候,主键ID并不都是这个名字.当出现三 ...

  4. 【MapReduce】一、MapReduce简介与实例

    (一)MapReduce介绍 1.MapReduce简介   MapReduce是Hadoop生态系统的一个重要组成部分,与分布式文件系统HDFS.分布式数据库HBase一起合称为传统Hadoop的三 ...

  5. cisco三层交换为vlan配置dhcp

        dhcp(config)#vlan 2 dhcp(config-vlan)#name sales dhcp(config-vlan)#vlan 3 dhcp(config-vlan)#name ...

  6. 统计学习方法 | 第1章 统计学习方法概论 | np.random.rand()函数

    np.random.rand()函数 语法: np.random.rand(d0,d1,d2……dn) 注:使用方法与np.random.randn()函数相同 作用: 通过本函数可以返回一个或一组服 ...

  7. group_by和having的用法

    #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Enum ...

  8. 配置Tomcat时退出就自动还原问题

    因为出现中文乱码问题需要配置server.xml文件,可是在每次配置完并且保存的情况下,重启服务器再看server.xml文件时,它自动还原到了未修改前的配置,后,解决如下: 第一步:打开eclips ...

  9. p24 map 之 golang基础

    Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. 参考文档 https://www.liwenzhou.com/posts/Go/08_map/ package main im ...

  10. python-day38(正式学习)

    目录 线程 线程开启的两种方式 1 2 子线程和子进程的创建速度 子线程共享资源 线程的join方法 守护线程 线程其他用法 线程 线程开启的两种方式 1 from threading import ...