2016-06-30 9 views
1

私はdjango 1.9を使用しています。カールを使ってdjango 1.9にデータを投稿

私は、次のフィールドを使用してフォームを持っている:私は、ブラウザからアクセスする際

class UploadFileForm(forms.Form): 
    component = forms.ChoiceField(choices=[(int(x.id), x.name) for x in Component.objects.all()]) 
    title = forms.CharField(max_length=200) 
    notes = forms.CharField(max_length=2000, widget=forms.Textarea(attrs={'rows': 5})) 
    file = forms.FileField() 

私は完全にフォームを使用することができます。

しかし、私は、フォームを埋めるためにカールを使用しようとすると、私は得続けるエラー「このフィールドはを必要とされる」

<ul class="errorlist"><li>This field is required.</li></ul> 
<p><label for="id_title">Title:</label> <input id="id_title" maxlength="200" name="title" type="text" /></p> 
<ul class="errorlist"><li>This field is required.</li></ul> 
<p><label for="id_notes">Notes:</label> <textarea cols="40" id="id_notes" maxlength="2000" name="notes" rows="5"> 
</textarea></p> 
<ul class="errorlist"><li>This field is required.</li></ul> 
<p><label for="id_file">File:</label> <input id="id_file" name="file" type="file" /></p> 
     <button type="submit"> upload file</button> 

csrdmiddlewaretoken私はそれを見ることができていますよう適切に受け入れられています応答出力。ここで

私が試し異なるカール要求されています

`curl <url> \ 
-X POST -H "Content-Type: application/json" \ 
-H "Accept: text/html,application/json" \ 
-H "X-CSRFToken: <token grabbed from form page source>" \ 
-H "Cookie: csrftoken=<token grabbed from form page source>" \ 
-d 'title=testCurl'` 

`curl <url> \ 
-X POST -H "Content-Type: application/json" \ 
-H "Accept: text/html,application/json" \ 
-H "X-CSRFToken: <token grabbed from form page source>" \ 
-H "Cookie: csrftoken=<token grabbed from form page source>" \ 
-F 'title=testCurl'` 

`curl <url> \ 
-X POST -H "Content-Type: application/json" \ 
-H "Accept: text/html,application/json" \ 
-H "X-CSRFToken: <token grabbed from form page source>" \ 
-H "Cookie: csrftoken=<token grabbed from form page source>" \ 
-d '{"title":"testCurl"}'` 

をこの作品たら、私は、ファイルフィールドにファイルを渡す方法を見つける必要があります。

誰もがこれで私を助けることができますか?

-----編集: @ohrstromからの提案に基づいて:私はChromeデベロッパーツールから「カールとしてコピー」ないとき

私は以下を参照してください。

curl 'http://localhost:8000/releases/binary_upload' -H 'Cookie: JSESSIONID=84666B9EE0BB747F04AC3179FEB78F65; csrftoken=E50JjoNz1qigYUehGdxPjnsscCNaFslu' -H 'Origin: http://localhost:8000' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.8' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryn3n6mrAf19RXCh3A' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: http://localhost:8000/releases/binary_upload' -H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="csrfmiddlewaretoken"\r\n\r\nE50JjoNz1qigYUehGdxPjnsscCNaFslu\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="component"\r\n\r\n13\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="title"\r\n\r\ntest1\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="notes"\r\n\r\ntest123\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A\r\nContent-Disposition: form-data; name="file"; filename="Topology_Components.png"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundaryn3n6mrAf19RXCh3A--\r\n' --compressed 

しかし、私は端末から同じコマンドを実行すると、それが提出されたファイルが空である」と言っ

========最終編集======== が見つかり解決策。以下の回答に追加してください。

あなたはより多くの実装の詳細が必要な場合は、ジャンゴでhttps://github.com/kiran-vemuri/DevServe

+0

をあなたはそれゆえ、エラー、フォームデータを送信していません。 [この質問](http://スーパーユーザー。curlを使用してフォームデータを送信する方法については、com/questions/149329/what-is-the-curl-command-line-syntax-to-do-a-post-request)を参照してください。 – solarissmoke

+0

ビューを表示してください。そこにJSONを処理していますか?そうでない場合は、なぜJSONを送信していますか? –

+0

curlコマンドを簡単に入手するには:開発ツールを開いたままブラウザ(chrome)でフォームを送信します。次に、リクエストを右クリックして、[カールとしてコピー]を選択します。 – ohrstrom

答えて

0

。私は現在django-restframeworkを実装しています。

すべてのタイプのHTTPリクエストでviewsetsを使用して、いくつかのファイル処理を追加しました。これで、次のREST呼び出しを使用してデータを送信できます。

` 
curl -H "Content-Disposition: attachment;" \ 
-X POST \ 
-F "name=test_file" \ 
-F "component_id=14" \ 
-F "notes=Hello World how are you.." \ 
-F "[email protected]<path-to-file>" http://localhost:8000/rest/binaries/ 
` 
0

フォームフィールドがデフォルトで必要とされる時にそれを見つけることができます。

https://docs.djangoproject.com/en/1.9/ref/forms/fields/#required

あなただけに「タイトル」フィールドを送信していますデータは、エラーを出さない唯一のフィールドです。

送信するデータにすべてのフォームフィールドを送信するか、必須フィールド= Falseにします。代わりに、直接WebフォームにPOSTリクエストを送信する

class UploadFileForm(forms.Form): 
    component = forms.ChoiceField(required=False, choices=[(int(x.id), x.name) for x in Component.objects.all()]) 
    title = forms.CharField(max_length=200) 
    notes = forms.CharField(required=False, max_length=2000, widget=forms.Textarea(attrs={'rows': 5})) 
    file = forms.FileField(required=False) 
+0

最初にすべてのフィールドを送信し始めました。すべてのフィールドでエラーが表示されたら、タイトルフィールドのみを送信して、エラーを解決する方法が見つかるかどうかを確認しました。上記のペースト結果を気付くと、タイトルフィールドにもエラーが表示されます。 –

0

私は非常にこれだけを使用するので、私は唯一のデータおよびその値を渡すために使用:

curl http://127.0.0.1:8000/api/ \ 
-H "Accept: application/json" \ 
-d '{"name":"testcurl","ph":"123456789"}' 
関連する問題