AJAX(ちょうどJS、jQueryなし)を介してHTMLフォームをアップロードしようとしています。フォームは、テンプレートによって、csrfトークン、ModelForm、および通常のDjangoフォーム(forms.Form)の3つのコンポーネントを追加して組み立てられます。モデルフォーム{{form.as_p}}はフォームの表示部分を構成しますが、フォーム{{order_form}}はいくつかの非表示フィールドを含みます。私のテンプレートのフォームセクションは次のようになります。DjangoバックエンドでFormData()オブジェクトは常に空です。
<form id="{{ form_id }}" action="javascript:submitThisForm('{{ form_id }}', '/submit_blog_entry/')" method='POST' enctype='multipart/form-data'>
{% csrf_token %}
{{ form.as_p }}
{{ other_form }}
<input type='submit' value='SAVE changes' />
</form>
私はすでに(私がいるFormData()がこれを自動的に追加することに別の質問への回答で読む)<form>
タグからのenctypeを削除しようとしたが、無駄に。
送信ボタンを押すと、フォームIDとAJAXリクエストに使用するURLを渡して、submitBlodEntryForm()JS関数が呼び出されます。そのJS関数のコードはここにある:
function submitThisForm(form_ID, url){
var submit_form = document.getElementById(form_ID);
var formData = new FormData(document.getElementById(form_ID));
httpRequest = new XMLHttpRequest();
if (!httpRequest){
alert("Giving up, cannot create an XMLHTTP instance.");
return false;
};
var url = "/submit_blog_entry/";
var sendCSRFtoken = "csrfmiddlewaretoken="+String(getCookie('csrftoken'));
var sendContent = sendCSRFtoken+"&"+formData;
httpRequest.onreadystatechange = alertContents;
httpRequest.open('POST', url, true);
httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//httpRequest.send();
httpRequest.send(sendContent);
// alternatively: httpRequest.send(formData);
}
AJAX要求がサーバ(Djangoのビュー)によって提出され、受信されます。上記のJSコード(変数sendContent)に示すようにcsrfトークンを手動で追加せずにformDataを送信しても、サーバーがトークンを見つけられないため、403エラーが表示されます。これは、しかし...
私はそれぞれのフォームに受信したデータを結合しようとすると、検証が失敗し、フォームの一部でなければなりません:
form = ThisForm(request.POST)
if form.is_valid():
#do something
私はrequest.POSTにあるもの印刷する場合、私は端末で次のように取得します。
<QueryDict: {'[object FormData]': [''], 'csrfmiddlewaretoken': ['token goes here']}>
明らかに、FormDataオブジェクトは空です。私は私の形で2つの必須のフィールドの2次のエラーを取得するので、私もこれを前提とし(form.errors.as_dataを使用して()):
[ValidationError(['This field is required.'])]
間違って何をして起こっていますか?私はFormData()が有用なデータを生成しないようなテンプレートを台無しにしましたか?間違ってAJAXリクエストを作成していますか?それとも、サーバー側の問題ですか(これまで何もしていません)。
ありがとう、何か助けていただきありがとうございます!
ありがとうございます。私はまたあなたのコードスニペットに示唆されているように、前もってやり直してみました。どちらもうまくいきません。フォームを渡さずに空のFormData()オブジェクトを作成してこれを追加しても、csrfトークンは(403エラーが再び発生しません)。 –