处理完POST请求后重定向

代码中new_item_text = ''的写法不怎么样。解决第二个问题时候,顺带把这个问题也解决了。

人们都说处理完post请求后一定要重定向,接下来就实现这个功能吧。修改针对保存POST请求数据的单元测试,不让它渲染包含待办事项的响应,而是重定向到首页。

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.assertEqual(response.status_code, 302)
self.assertEqual(response['location'], '/')

不需要再拿响应中的.content 属性值和渲染模板得到的结果比较,因此把相应的断言删掉了。现在,响应是HTTP重定向,状态码是302,让浏览器指向一个新地址。修改之后运行结果200!=302,现在可以大幅度清理视图函数了

from django.shortcuts import render, redirect
from lists.models import Item
from django.http import HttpResponse # Create your views here.在这儿编写视图
def home_page(request):
if request.method == 'POST':
Item.objects.create(text=request.POST['item_text'])
return redirect('/')
return render(request,'home.html')

现在测试可以通过了python manage.py test

----------------------------------------------------------------------
Ran tests in .012s OK
Destroying test database for alias 'default'...

更好的单元测试实践方法,一个测试只测试一件事

单元测试实践方法要求,一个测试只能测试一件事,因为这样便于查找问题。如果一个测试中有多个断言,一旦前面的断言导致失败,就无法得知后面的断言情况如何(如,如果不小心破坏了视图函数,我们想知道到底是保存对象时出错了,还是响应的类型出错了)

刚开始可能无法写出只有一个断言的完美单元测试,不过现在可以把正在开发的功能分开测试(上面一个功能分为两个)。

#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') def test_redirects_after_POST(self):
response = self.client.post('/', data={'item_text': 'A new list item'})
self.assertEqual(response.status_code, 302)
self.assertEqual(response['location'], '/')

现在运行应该看见有六个测试通过,而不是五个。

----------------------------------------------------------------------
Ran tests in .014s OK
Destroying test database for alias 'default'...
05-23 10:22