2017-10-26 11 views
0

を送信するものとは異なるJSONを受けてのIntelliJで、私は休憩を設定 ジャンゴPOSTハンドラは、私はこのようなジャンゴPOSTハンドラを持って、私は

class FooTests(TestCase): 
    def setUp(self): 
     self.url = '/foo/' 
     self.fields = {'foo': 'bar'} 

    def test_post_data(self): 
     response = self.client.post(self.url, data=self.fields) 
     data = json.loads(response.json()) 
     self.assertEqual(self.fields, data[0]['fields']) 

最初の行の test_post_data()post()のポイント。 self.fieldstest_post_data()に調べると、私が設定したdictが表示されます。しかし、 fieldspost()で調べると、値は <QueryDict: {'foo': ['bar']}>です。この QueryDictの正しいキーが表示されますが、値は リストで、テストから送信された文字列が含まれています。なぜ私の送ったものから値が変わったのですか?

p.s.私のモデルは次のようなものです:

class Foo(models.Model): 
    foo = models.CharField(max_length=25) 
+0

ここに明示的にリストを作成していませんか? json = serializers.serialize( 'json'、[foo]) –

+0

@AlexanderDavydov 1.これはModelオブジェクトのリストです。 2. JSONの不思議な変化の後に**起こります。 –

答えて

2

これはちょうどQueryDictが動作する方法です。同じキーに対して複数の値を設定できます。つまり、a=1&a=2&b=1のようなデータを処理できるということです。

でアイテムを取得するか、request.POST.getlist('key')でリストを取得できます(あなたの場合は1つのアイテムのリストになります)。

+0

POSTハンドラでHTTPリクエストの本文にJSONを受け取るようにします。 'request.POST'はこれを行う正しい方法ではありませんか? –

+1

'request.POST'はフォームエンコードされたデータに対してのみ機能します。 jsonデータを投稿する場合は、 'self.client.post(self.url、json.dumps(self.fields)、content_type =" application/json ")'を実行する必要があります。次に、あなたの見解では、 'request.POST'の代わりに' json.loads(request.body) 'を使います。 – Alasdair

+0

"すべてのHTTP POSTパラメータを含む辞書形式のオブジェクト。**リクエストにフォームデータが含まれています。**"おっと、私は最初の20回の読解でそれを逃しました。ありがとう。 –

関連する問題