メッセージについて
この記事はDjangoのメッセージについて解説します。
この記事を読むことによって、メッセージの基本的な知識と使い方について知る事ができます。
メッセージとはなにか
メッセージとは、いわゆるフラッシュメッセージのことです。
記事などを保存した時、『保存しました』といった結果報告がある事が多いです。
このメッセージのことを一般にフラッシュメッセージと呼び、Djangoでも使用できます。
この記事ではフラッシュメッセージの事もメッセージと呼びます。
メッセージフレームワーク
Djangoでフラッシュメッセージを使用するには、メッセージフレームワークを使用します。
メッセージフレームワークと大仰な名前がついていますが、最初の内はフラッシュメッセージを表示するためのDjangoの機能ぐらいの認識で良いと思います。
メッセージフレームワークはsettings.py
のINSTALLED_APPS
で読み込む必要があります。
デフォルトで読み込まれているはずですが、念のため確認してみてください。
INSTAllED_APPS = [
...
'django.contrib.messages',
...
]
このようになっていればOKです。
また、MIDDLEWARE
にもいくつか必要なミドルウェアが読み込まれています。
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
...
'django.contrib.messages.middleware.MessageMiddleware',
...
]
さらに、コンテキストプロセッサーも必要です。
コンテキストプロセッサーについては別の記事で解説します。
ここでは、必要なんだな、と思ってください。
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'django.contrib.messages.context_processors.messages',
],
},
},
]
繰り返しになりますが、これらの設定はデフォルトで有効になっているはずです。
メッセージの使い方
実際にどのようにしてメッセージを使用するかについて解説します。
メッセージはViewで設定してテンプレートで表示します。
Viewでの記述
Viewのどこかで以下のように設定します。具体的にどこに記述するのかは後述します。
まずはこんな感じのコードになるんだなぁと思ってください。
from django.contrib import messages
messages.success(request, "メッセージをセットします")
説明無くrequest
という変数を使っています。
これは、Viewに必ず渡される変数です。中身はアクセスしたユーザーのリクエスト情報が入っています。
まぁそういうのがあるんだなぁと思ってください。
ここでは、request
という変数が渡ってきているはずだからそれを使うのだ、ということをご理解いただければ十分です。
メッセージの追加
まず、メッセージフレームワークを使用するために、messages
をインポートします。
messages
にはsuccess
やwarning
、error
などの関数が定義されています。
名前の通り、success
は成功時でwarning
は注意喚起、error
は保存に失敗したときなどのメッセージに使用します。
使い方は以下のとおりです。
messages.関数名(requestに相当する変数、表示したいメッセージ)
関数名は前述のsuccess
などです。
引数は2つあります。
ひとつめはrequest
に相当する変数です。
これは、クラスベースビューであればself.request
です。関数のビューであれば渡された最初の引数です。
いつも同じ変数が入る入ると思っていただいて良いと思います。
次に、表示したいメッセージを渡します。
余談ですが、success
でメッセージを追加した場合、テンプレートではsuccess
を出力することができます。
CSSなどでメッセージを装飾する際に役立つでしょう。
これについても後述します。
テンプレートでの記述
次に、テンプレートの記述を示します。
テンプレートでは、以下のように記述して表示します。こちらも詳しいところは後述します。
{% for msg in messages %}
<p class="{{ msg.tags }}">{{ msg }}</p>
{% endfor %}
メッセージフレームワークではmessages
変数がテンプレートに渡されます。
文字通りViewで設定したメッセージが格納されています。メッセージは1つとは限りませんので、この変数はリストです。
テンプレートではfor
文を使用して取り出して表示します。
この二つのコードによって、テンプレートにメッセージが表示されます。
Viewに差し込む
次に、具体的にどこでメッセージを設定するのか、を説明します。
メッセージは通知ですので、なにか処理をした後にその処理の結果を通知することが大半です。
したがって、そういった処理の結果が分かる部分で設定することが多いはずです。
特定の場所でしか設定できないわけではなく、必要に応じてメッセージを設定してください。
ここでは、代表的な使用箇所を例とともに紹介したいと思います。
form_validメソッド
form_valid
メソッドはCreateView
やUpdateView
などで処理が成功して、データを保存する直前に呼ばれるメソッドです。
このメソッドは成功のメッセージを出すのにちょうど良さそうです。
ここに成功のメッセージを設定してみましょう。
from django.contrib import messages
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(CreateView):
model = Article
success_url = "/"
def form_valid(self, form):
messages.success(self.request, '保存しました')
return super().form_valid(form)
form_valid
メソッド内でメッセージを設定しています。
その後に、親クラスの同メソッドを呼んで、CreateView
の処理を実行します。
このようにすれば、CreateView
の処理内に自分の処理を差し込むことができます。
あとは、テンプレートにメッセージのコードを記述するだけです。
この辺は後述します。
form_invalid メソッド
form_invalid
メソッドは、CreateView
やUpdateView
で処理が失敗したときに呼ばれるメソッドです。
このメソッドは失敗のメッセージを出すのにちょうど良さそうです。
ここでは、失敗のメッセージを設定します。
前述のform_valid
メソッドを記述した状態に追記します。
普通はこのようになりますからね。
from django.contrib import messages
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(CreateView):
model = Article
success_url = "/"
def form_valid(self, form):
messages.success(self.request, '保存しました')
return super().form_valid(form)
# ここから追加
def form_invalid(self, form):
messages.error(self.request, '保存に失敗しました')
return super().form_invalid()
form_invalid
メソッドでメッセージを設定しました。
変化した部分はerror
部分ですね。
他はform_valid
と同様です。
テンプレートで表示する
いよいよテンプレートで表示してみましょう。
前述しましたが、テンプレートにはメッセージが複数渡されてくる可能性があります。
したがってmessages
はリストとして渡されるので、そこだけ注意してください。
では、前述したテンプレートの例で解説していきます。
{% for msg in messages %}
<p class="{{ msg.tags }}">{{ msg }}</p>
{% endfor %}
messages
をfor
文で取り出すのはご理解いただけると思います。
取り出したmessages
の要素は、そのまま変数として評価すると『保存しました』などのViewで設定したコメントが表示されます。
そして、msg.tags
を評価すると、success
やerror
などの文字列が出力されます。
これは、CSSなどのクラス名として使用することができます。今回の例ではclass
に出力しています。
- もし、,
messages.success
でメッセージを使用すると、tags
で出力される文字はsuccess
です。 - もし、
messages.error
でメッセージを使用すると、tags
で出力される文字はerror
です。
もしmessages.success
でメッセージを出力したのであれば以下のようになります。
保存に成功したと仮定しましょう。
<p class="success">保存しました</p>
もし、messages.error
でメッセージを出力したのであれば以下のようになります。
<p class="error">保存できませんでした</p>
これらの文字列はdjango.contrib.messages.constants
に定義されています。
定義されているということは拡張することも可能ですが、本項では触れません。
ライブラリを使う
メッセージを使用すると感じるのは「必要なのは理解しているが、めんどくさい」だと思います。
ユーザーが使用するすべてのアクションにメッセージを仕込むので、正直やってられなくなります。
そういったニーズに対応するためなのかライブラリを作成してくださった方がいます。
django-braces
というライブラリを使うと手間が少しだけ省けます。
django-braces
にはFormMessagesMixin
やFormValidMessageMixin
などのmixinが定義されています。
詳しくはdjango-bracesに記載されています。
このライブラリについては別の記事で解説しようと思います。