入門クラス

【Django】メッセージとは

メッセージについて

この記事はDjangoのメッセージについて解説します。

この記事を読むことによって、メッセージの基本的な知識と使い方について知る事ができます。

メッセージとはなにか

メッセージとは、いわゆるフラッシュメッセージのことです。

記事などを保存した時、『保存しました』といった結果報告がある事が多いです。
このメッセージのことを一般にフラッシュメッセージと呼び、Djangoでも使用できます。

この記事ではフラッシュメッセージの事もメッセージと呼びます。

メッセージフレームワーク

Djangoでフラッシュメッセージを使用するには、メッセージフレームワークを使用します。

メッセージフレームワークと大仰な名前がついていますが、最初の内はフラッシュメッセージを表示するためのDjangoの機能ぐらいの認識で良いと思います。

メッセージフレームワークはsettings.pyINSTALLED_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にはsuccesswarningerrorなどの関数が定義されています。

名前の通り、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メソッドはCreateViewUpdateViewなどで処理が成功して、データを保存する直前に呼ばれるメソッドです。

このメソッドは成功のメッセージを出すのにちょうど良さそうです。

ここに成功のメッセージを設定してみましょう。

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メソッドは、CreateViewUpdateViewで処理が失敗したときに呼ばれるメソッドです。

このメソッドは失敗のメッセージを出すのにちょうど良さそうです。

ここでは、失敗のメッセージを設定します。

前述の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 %}

messagesfor文で取り出すのはご理解いただけると思います。

取り出したmessagesの要素は、そのまま変数として評価すると『保存しました』などのViewで設定したコメントが表示されます。

そして、msg.tagsを評価すると、successerrorなどの文字列が出力されます。

これは、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にはFormMessagesMixinFormValidMessageMixinなどのmixinが定義されています。

詳しくはdjango-bracesに記載されています。

このライブラリについては別の記事で解説しようと思います。

-入門クラス
-,