Django で Form に値をいれて POST メソッドを実行
view のメソッドを使ってデータを投入したかったので、調べてました。
別にテストするわけではなかったんだけど。
# https://docs.djangoproject.com/en/1.9/topics/testing/tools/#overview-and-a-quick-example from django.test import Client # username, password を指定しない時は anonymous になります。 c = Client() c.login(username=username,password=password) """ たとえ複数の Form モデルを使って 1つの POSTしたとしても フィールド名だけ指定すれば良い様子。 """ c.post('/app_name/view_method/', { 'weather': '晴れ' # class FormOne(Form) 'date': '3月15日' # class FormTwo(Form) 'content': '今日はラーメンを食べるお。' # class FormThree(Form) })
補足
Client.post メソッドについて
post(path, data=None, ...)
Makes a POST request on the provided path and returns a Response object,post(path, data=None, ...)
post | Testing tools
post メソッドは 与えられたパスをもとに POST request を生成して、Response
オブジェクトを返します、....
Client.post メソッドの返り値について
The get() and post() methods both return a Response object. This Response object is not the same as the HttpResponse object returned by Django views; the test response object has some additional data useful for test code to verify. Specifically, a Response object has the following attributes:
Testing responses | Testing tools
その Client.post メソッドが返す Response
オブジェクトとは違うよと言われた HttpResponse
オブジェクト
Request and response objects | Django documentation | Django
調べていたこと
print(request.POST)
の実行結果。確認してみると Form を継承したクラス名は指定せずに、属性名、フィールド名だけを指定している様子。辞書の要素側は、list に格納されている。
<QueryDict:{ 'weather': ['晴れ'] # class FormOne(Form) 'date': ['3月15日'] # class FormTwo(Form) 'content': ['今日はラーメンを食べるお。'] # class FormThree(Form) }>
print(request.POST)
の型は、QueryDict 型という辞書型の親戚みたいなもの。
そのほか参考
後で読む、重要そう。
Django unit testing for form edit - Stack Overflow
検索キーワード
django+http+request+create
view.py をテストするなら request を生成して値を設定した方がいいのかな。
HTTPRequestオブジェクトの手動生成 - logiqboard
単に form をテストしたいだけなら Client.post は使わなくてもいいよ。
python - Writing tests for Forms in Django - Stack Overflow
これなんだろ...
Django Test Client: Test that context is a RequestContext object - Stack Overflow