Yaji_S’s diary

プログラミング学習のアウトプットブログ

【Django】メッセージフレームワークの実装について

アプリの投稿などアクションの結果をメッセージとして表示させる為の機能として、メッセージフレームワークというものがあります。今回はメッセージフレームワークの実装について書いていきます。

 

1.setting.pyの確認・設定

setting.py

INSTALLED_APPS = [
...
'django.contrib.messages',
...
]
 
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#今回は下記のMESSAGE_STORAGEの設定ではSessionMiddlewareを上に設定する必要あり
...
]
 
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'django.contrib.messages.context_processors.messages',
],
},
},
]
 
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
 

INSTALLED_APPS、MIDDLEWAREはデフォルトの状態で上記のようになっています。

MESSAGE_STORAGEの設定はパフォーマンスに優れたCookieStorageやCookieStoragenとSessionStorageの適位切替の設定(FallbackStorage、デフォルト設定)がありますが、一部うまく表示されないことがあるそうです。

 

2.view.pyの設定

viewでは主にmessagesのインポートと関数にメッセージ文を組み込みます。 

#messagesのインポート
from django.contrib import messages
 
#メッセージのタイプは以下の通りタイプによってテンプレートのhtmlのclassが変わります。
messages.info(self.request, "メッセージ内容")
messages.success(self.request, "メッセージ内容")
messages.warning(self.request, "メッセージ内容。")
messages.error(self.request, "メッセージ内容")
messages.debug(self.request, "メッセージ内容")
 

 

自分の使用例

view.py
from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin
from django.views.generic import UpdateView
from django.contrib import messages
from .forms import UserUpdateForm 
 
 
class UserUpdateView(UpdateView, UserPassesTestMixin, LoginRequiredMixin):
model = CustomUser
form_class = UserUpdateForm
template_name = 'user_info.html'
success_url = '/'

def form_valid(self, form):
form.instance.custom_user = self.request.user
messages.info(self.request, "プロフィールを更新しました。")
return super().form_valid(form) #formのrequestのメッセージとしてreturn
 

 

 また、messages.success(self.request, "メッセージ内容")の内容であれば、

以下のSuccessMessageMixinのインポートとsuccess_message = "メッセージ内容"で実装できます。以下はログイン時のメッセージ導入の場合。

view.py
 
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.views import LoginView
 
class LogInView(SuccessMessageMixin, LoginView):
template_name = 'account/index.html'
success_url = '/userpage'
success_message = "ログインしました。"

汎用view(django.views.generic)であれば、CreateView, UpdateView, DeleteViewなどで使えるそうです(自分では未検証)。

 

3.templateファイル

{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}"> #メッセージのタイプによってclass名が変わる
<div class="message-body">
{{ message }}
</div>
</div>
{% endfor %}
{% endif %}

実装の様子 

字が小さいですがメッセージの導入が完了しました。

このままでは見た目がアレなので、次回はフロントエンド側について書いていきます。