本記事では「初めてのDjango」(入門編)として、初めてDjangoというフレームワークを使用してWebアプリケーションを作ってみたい!という方向けに、簡単なアプリケーションを作成しながら基本的な知識をご紹介していきます。
・とりあえず手を動かしてWebアプリケーションを作成してみたい!
・pythonはある程度知識ある
本記事は連作になっております。
- (入門編 #01)単一ページのアプリケーション作成まで
- (入門編 #02)CSSの適用からベーステンプレートの作成まで
- (入門編 #03)コンテキスト情報とテンプレートタグの活用
- (入門編 #04)お問い合わせフォームの設置、メール送信処理まで
- (入門編 #05)お問い合わせ送信後にメッセージを表示させる ←イマココ
- (入門編 #06)アプリケーションをGAEにデプロイ
- (発展編 #01)データベースの設定を行う
- (発展編 #02)カスタムユーザーモデルの定義、マイグレーション
- (発展編 #03)django-allauthで認証機能を実装する
- (発展編 #04)ListViewを用いてモデル情報を描写する
- (発展編 #05)CreateViewを使用してデータベースを更新
- (発展編 #06)DetailViewを用いて詳細表示
- (発展編 #07)UpdateViewを用いてデータベース編集
- (発展編 #08)DeleteViewを用いてデータベースのレコード削除
もし本記事のみご覧になる方は、こちらからファイル群をダウンロードすることで、実際に手を動かしながら学ぶことができるかと思います。
振り返り
前回記事ではお問合せフォームを設置し、さらに実際にメールを送信する処理まで実装しました。
しかし現状のままですと、メールを送信した後に何も変化がないので、ユーザーは「ちゃんとメールが送信されたのか、、、?」と不安になってしまいます。
本記事ではまず、メールを送信した後にメッセージが表示されるようにしたいと思います。
メール送信後のメッセージが表示されるようにする
メール送信後のメッセージをこのように表示させます。
ちゃんと送信できたか分かりやすいですね!
ビューの編集
まずはメッセージを出力したいビュー(ContactView)に対して、下記のようにコードを編集してください。
# ... 略 ...
from django.contrib import messages
# ... 略 ...
class ContactView(generic.FormView):
template_name = "contact.html"
form_class = ContactForm
success_url = reverse_lazy('cafe_app:contact')
# ... 略 ...
def form_valid(self, form):
form.send_email()
messages.success(self.request, 'お問い合わせありがとうございます。')
logger.info('Contact sent by {}'.format(form.cleaned_data['name']))
return super().form_valid(form)
ハイライト部分を追加してください。
16行目のように、messages.successメソッドを用いることでメッセージをテンプレートに渡すことができます。テンプレート側では messages という変数でこの渡したメッセージを扱うことができます。
またメッセージはレベルを分けて吐き出すことができ、「SUCCESS」「INFO」「WARNING」「ERROR」というレベルがあります。
処理が失敗した場合は messages.error() を用いるなど、適宜レベルを分けてメッセージを吐き出すことができます。今回はメール送信処理が正常に処理できた場合のメッセージなので messages.success() を用いています。
テンプレートの編集
続いて、各ページで共通利用する base.html を次のように編集しましょう。
<body>
<!-- messages -->
{% if messages %}
<div class="wrapperMessages">
<div class="messagesInner">
<ul>
{% for message in messages %}
<li class="message">{{ message }}</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% block contents %}{% endblock contents %}
<!-- 略 -->
</body>
先ほどもちょろっと触れました、テンプレート側に messages という変数でメッセージのリストが渡されます。なので、まずは {% if message %} で messages が空かどうかのチェックを行なっています。
{% if messages %}
<!-- messagesが空じゃなかった時の処理 -->
{% endif %}
またforを用いて messages の中身を順に取り出しています。
<!-- messagesの中身を順に取り出し -->
{% for message in messages %}
<li class="message">{{ message }}</li>
{% endfor %}
この状態でお問い合わせを送信すると、ページ上部に「お問い合わせありがとうございます。」と表示されます!
ついでにCSSも下記を追加し、見た目を整えましょう!
/* messages */
.wrapperMessages {
background-color: var(--base-color);
padding: 20px 0;
}
.message {
background-color: var(--semi-dark-color);
width: fit-content;
padding: 10px 20px;
margin: .2rem auto;
color: var(--base-color);
box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;
}
再度になりますが、このように表示されるはずです。
メッセージ内容や見た目はお好きなように編集していただいて構いません。
メッセージレベルによって見た目を変更する
ここまでで、お問い合わせが送信されたらメッセージが表示されるようになりました。
しかし現在のままだと、どのメッセージレベルにおいても同じ見た目で出力されてしまいます。ユーザー視点で考えると、「正常に処理された場合のメッセージ」よりも「エラー内容を表すメッセージ」の方を目立たせた方が良いと思います。
これを実現させるために、まずは「cafe」ディレクトリ直下にある settings.py に下記を追加します。
# ... 略 ...
from django.contrib.messages import constants as messages
# ... 略 ...
MESSAGE_TAGS = {
messages.ERROR: 'message-danger',
messages.WARNING: 'message-warning',
messages.SUCCESS: 'message-success',
messages.INFO: 'message-info',
}
この MESSAGE_TAGS リストにて、各レベルに応じたタグを設定することができます。またテンプレート側で {{ message.tags }} と記述して取り出すことができます。
これによって、各メッセージレベルに応じたクラス名を与えることができます!
試しに、ビューにて全てのメッセージレベルで出力するようにしてみます。
def form_valid(self, form):
form.send_email()
# messages.success(self.request, 'お問い合わせありがとうございます。')
messages.error(self.request, 'errorです。')
messages.warning(self.request, 'warningです。')
messages.success(self.request, 'successです。')
messages.info(self.request, 'infoです。')
logger.info('Contact sent by {}'.format(form.cleaned_data['name']))
return super().form_valid(form)
さらに base.html の一部を次のように編集します。
{% for message in messages %}
<li class="message {{ message.tags }}">{{ message }}</li>
{% endfor %}
この状態でお問い合わせを送信してみましょう!
4つのメッセージが表示されております。見た目は同じですが、html構造はどのようになっているでしょうか、、。開発者ツールで覗いてみます。
このように、先ほど settings.py の MESSAGE_TAGS にて設定したタグが {{ message.tags }} で取り出せており、class名として適用されているのが確認できます。
したがって、下記のようにCSSを適用させることでメッセージレベルに応じて見た目を変更することができます。
.message-danger {
background-color: red;
color: white;
}
CSSが効かない時は、ブラウザのキャッシュを削除すると解決する場合があります。
無事メッセージレベルごとに見た目を変化させることができました!
このままでと、ただお問い合わせを送信しただけで4つもメッセージが表示されてしまうので、views.py は元に戻しておきましょう。
この時点でのコード全体をGithubに載せております。確認用としてお使いいただければと思います。
まとめ
本セクションでは、お問い合わせ送信後のメッセージを表示させ、さらにメッセージレベルに応じて見た目を変更するまでをご紹介させていただきました。
次回はいよいよアプリケーションをデプロイし、通常のサイトとして使用できるようにするまでをご紹介いたします!
コメント
コメント一覧 (11件)
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]
[…] (入門編 #05)お問い合わせ送信後にメッセージを表示させる […]