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 メソッドは 与えられたパスをもとに POST request を生成して、Response オブジェクトを返します、....

post | Testing tools

 

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