POSTフォーム
CoddyのDjangoジャーニー「フォーム」セクションの一部。レッスン 2/20。
/events/new/ページとそのビューは準備できていますが、イベントを追加するフォームがページにありません。データを変更するフォームでは、method="post"を使います。ブラウザーはフィールドをURLではなくリクエストの本文で送信します。ビューは各入力のnameをキーとして、request.POSTから値を読み取ります。
DjangoはすべてのPOSTフォームも保護します。別のウェブサイトが、あなたのサイトにPOSTするフォームを隠し、訪問者のブラウザーにCookieとともに送信させることができます。この攻撃はクロスサイトリクエストフォージェリと呼ばれ、略してCSRFといいます。そのためDjangoは、自分のページから取得した秘密のトークンを含まないPOSTをすべて403 Forbiddenで拒否します。フォーム内の{% csrf_token %}がそのトークンを書き込みます。ニュースレターのフォームの例です。
<form method="post">
{% csrf_token %}
<label for="email">Email</label>
<input id="email" name="email" type="email">
<button type="submit">Subscribe</button>
</form><label>は、forが一致するidを持つ入力の名前を示し、type="date"はカレンダーを表示します。
チャレンジ
簡単events/templates/events/new_event.htmlで、{# Write the form here #}をフォームに置き換えます。
method="post"を使い、最初に{% csrf_token %}を置きます。これがないと、Djangoはフォームを403で拒否します。title、date(type="date"を指定)、placeのラベル付き入力欄を追加し、その後に送信ボタンを追加します。
イベントを追加してから、「すべてのイベント」を押します。一覧に表示されています。
自分で試してみよう
{% extends "events/base.html" %}
{% block title %}Add an event{% endblock %}
{% block content %}
<h1>Add an event</h1>
{# ここにフォームを記述する #}
{% endblock %}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
フォームのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド