Djangoのお問い合わせフォームを作る。Djangoのお問い合わせフォームを作る。2018年12月15日Djangoのお問い合わせフォームを作る。contextによるデータの受け渡しDjangoPythonよくホームページなどで見かけるお問い合わせフォームをDjangoサイトに作成します。「お問い合わせフォーム」→「お問い合わせ内容確認」→「お問い合わせ内容をメール送信」の流れを作ります。準備お問い合わせフォーム概要settings.pymodels.pyurls.pyforms.pyviews.pyテンプレートお問い合わせフォーム前回、パスワードリマインダ機能を作成しました。今回は、ユーザがサイト管理者にお問い合わせしたい場合に備え、お問い合わせページを作成します。送信前に一度入力内容を確認するためにお問い合わせ内容確認ページを作ります。このとき、contextによるページ間のデータ受け渡し処理を行います。これらを実現するため、セッションと汎用ビューを利用します。手順お問い合わせページにメッセージを入力して確認を押します。お問い合わせ内容確認ページに移動します。お問い合わせ内容確認ページで送信をクリックすると、メッセージが送信されてトップページへ戻ります。お問い合わせ内容確認ページで戻るをクリックすると、お問い合わせページへ戻ります。このとき、入力メッセージは保持します。URL設計トップページ(/index)ドメイン直下のページです。ログイン前はページタイトルのみですが、ログインすると、ヘッダーナビゲーションにログアウトのリンクを表示します。お問い合わせフォーム(/contact)お問い合わせフォームを表示します。お問い合わせフォーム確認(/contact_confirm)ユーザがお問い合わせフォームに入力した内容を確認するためのページです。戻るボタンを押すと、入力内容を保持します。お問い合わせ送信(/contact_send)お問い合わせフォームの入力内容をメールとして送信します。ページは表示しませんが、送信が完了するとトップページにリダイレクトします。Djangoのプロジェクトを作成済み。gmailを利用済み。(GmailのSMTPでも可。)仕様1トップページです。「ドメイン/」にアクセスします。画面右上にお問い合わせフォーム(contact)へのリンクがあります。お問い合わせフォーム画面です。「ドメイン/contact」にアクセスします。お問い合わせフォーム確認画面です。「ドメイン/contact_confirm」にアクセスします。お問い合わせフォーム確認画面で送信を押すと、サイト管理者宛にメッセージが送信されます。&lt;xxxxxxxxx.xxxxxxxxxxxxxxxxxxx@localhost.localdomain&gt;メッセージ送信テストを実行します。トップページへリダイレクトします。準備Vagrantでゲスト環境(仮想環境)を作ります。1Userモデルをカスタマイズしています。→DjangoのUserモデルカスタマイズ(UUIDを使う)2ユーザ登録機能を作ります。→Djangoのログイン・ユーザ登録(カスタムユーザモデル)3仮登録した後、メールから本登録する機能を作ります。→仮登録した後、メールから本登録させる(Django)4パスワードリマインダ機能を作ります。7.1.1503pyenv1.1.3-5-g7dae197Anaconda3-4.3.0MariaDB5.5.52-1.el7Apache2.4.6mod_wsgi4.5.14Django1.11.3お問い合わせフォーム概要Userモデルの継承してカスタマイズします。usernameの代わりにemailを使うようにしています。1以下のようなDjangoアプリ構成を作ります。プロジェクト名が「pj1」で、アプリケーション名が「users」です。プロジェクトの設定は済ませたものとします。赤字のファイルは、今回変更する部分です。pj1/pj1/__init__.pysettings.pyurls.pywsgi.pyusers/__init__.pyadmin.pyapps.pyurls.pyviews.pymodels.pytoken_manager.pytemplates/base.htmlcontact.htmlcontact_confirm.htmlindex.htmllogin.htmlregist.htmlmailtemplate/password_reset/message.txtsubject.txtmanage.pysettings.pypj1ディレクトリ下のsettings.pyを変更します。ログイン関連のURLや、Gmailで送信する設定をしています。Truemodels.py1特に変更はありません。内容は前回と同じです。→DjangoのUserモデルカスタマイズ(UUIDを使う)urls.py1pj1ディレクトリのurls.pyを以下のように編集します。'users'))]2usersディレクトリのurls.pyを以下のように編集します。name='contact_send'),]forms.py1usersディレクトリ配下のforms.pyを編集します。以下の内容を追記します。ValidationError(&quot;正しいメールアドレスを指定して下さい。入力フォームを定義します。「widget=forms.Textarea」は、inputタグを複数行入力に設定します。'6'入力フォームの初期値を設定します。「class」はinputタグのclassを、「placeholder」は入力フォーム内に表示する文字を、「maxlength」は入力可能な文字数を設定します。「rows」は、「Textarea」の行数です。ValidationError(&quot;正しいメールアドレスを指定して下さい。&quot;)フォームに入力されたEmailのバリデーション(入力確認)を行います。フォームから送信(POST)したデータは、ContactFormのcleaned_dataに格納されます。その情報をもとにvalidate_emailでメールアドレスのフォーマットとして正しいか確認します。views.py1usersディレクトリのviews.pyを以下のように編集します。初回の入力欄表示は以下の表示。'contact.html'汎用ビューの「FormView」を使用します。お問い合わせフォームのhtmlテンプレートを指定します。ContactFormお問い合わせフォームクラスを指定します。reverse_lazy('users:contact_confirm')post後のリダイレクト先を指定します。初回の入力欄表示は以下の表示。self.form_class(form_data)「確認画面へ」ボタンを押したら、form_data変数にPOST内容を格納します。表示・お問い合わせ確認画面から「戻る」リンクでリダイレクトしてきた場合は、セッションの内容をform_dataに代入します。super().form_valid(form)ユーザが入力したデータの検証に成功したら、セッションにその内容を格納します。contextお問い合わせフォーム確認ページを表示します。「self.request.session.get()」でセッションを取得します。reverse_lazy('users:index')お問い合わせフォームの内容を送信し、トップページ(index)へリダイレクトするだけのクラスです。URLは存在しますがページは表示しません。self.form_class(form_data)セッションをpopで取り出し、その情報を元にメール文を作成します。send_mail()でメールを送信します。テンプレート「Base.html」、「index.html」、は、前回の通りです。%}「contact.html」は、お問い合わせフォーム画面を定義します。%}「contact_confirm.html」は、お問い合わせフォーム確認画面を定義します。