Djangoラーニングシリーズ15:POSTリクエストのデータをデータベースに格納する

7152 ワード

トップページの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)  # 1
        new_item = Item.objects.first()  # 2
        self.assertEqual(new_item.text, 'A new list item')  # 3
        
        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(), 1)  # 1
AssertionError: 0 != 1

ビューを変更
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、複数のリストをサポートする!
 
コード再構築
解決ユニットテストは一度に1つだけテストし、既存のコードに断言を追加し、新しいテスト方法を定義します.
# 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']  # 1
        Item.objects.create(text=new_item_text)  # 2
    else:
        new_item_text = ''  # 1

    return render(request, 'home.html', {
        'new_item_text': new_item_text,  # 1
    })

コード解析:
#1使用名new_item_textの変数で、その値はPOSTリクエストのデータ、または空の文字列です.
#2 .objects.create()は、呼び出しを必要とせずに新しいItemオブジェクトを作成する簡略化された方法である.save()メソッド.
再構築してテストに合格しました