【django】メッセージフレームワークの使い方【関数ビュー】

Django

Django のフラッシュメッセージの使い方を紹介します。

フラッシュメッセージはフォームなどのユーザーが
入力するプロセスの後に出てくる通知メッセージのこと。

その使い方を紹介していきます。

まず最初は簡単なサンプルを書いていきます。

views.py

まず最初にメッセージフレームワークでの
views.pyを解説していきます。

最初に必須なのはviews.pyに
モジュールをインポートすることです。

from contrib import messages

ここからviews.pyに書いていきます。

ここではサンプルとして全部のメッセージの種類を書き
renderで表示する場合を書いていきます。

render でメッセージを表示

def message_sample(request)
    count = 'test'
    messages.debug(request, '%s SQL statements were executed.' %count)
    messages.info(request, 'Three credits remain in your account.')
    messages.success(request, 'Profile details updated.')
    messages.warning(request, 'Your account expires in three days.')
    messages.error(request, 'Document deleted.')
    return render(request, 'sample.html')

メッセージの種類は5種類です。
‘debug’, ‘info’, ‘success’, ‘warning’, ‘error’の5種類です。

ここからhtmlにメッセージを表示するコードを追加していきます。

HTML

{% if messages %}
{% for message in messages %}
    <li>{{ message.tags }}:{{ message }}</li>
    {% endfor %}
{% endif %}

これだけでメッセージは表示されます。

{{ message }}がフラッシュメッセージの内容になり
{{  message.tags }}はメッセージの5種類になります。

おそらく表示画面は以下のようになるはずです。

ここでは「debug」で設定したメッセージがないです。

これはdjangoの設定でもあり
djangoの公式サイトでも以下のように書かれてます。

DEBUG:プロダクション環境では無視 (ないし削除) される、開発に関連したメッセージ

Django公式サイト’https://docs.djangoproject.com/ja/3.1/ref/contrib/messages/

debug を表示するには

もし、「debug」を表示させたい場合は
settings.pyに以下を追加しましょう。

from django.contrib.messages import constants 

MESSAGE_LEVEL = message_constants.DEBUG

これを追加することで、表示画面は変更されます。
「debug」が追加された形になります。

redirect でメッセージを表示

通常のメッセージはユーザが入力した後に表示するため
「render」で表示させるよりも、入力後にバリデーションを通し
「redirect」で表示させることが多いです。

例えば、下記のような形になります。
ここでのTestFormは適当に作ったものです。
適宜変更してください。

def message_sample2(request)
    form = TestForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            message.success(request, 'フォームを送信しました')
            return redirect('sample')

ここでのリダイレクト先は先ほどのHTMLを設定しています。

bootstrapsで表示を行う

他のサイトでもよく紹介してあるメッセージと
bootstrapsとの組み合わせ。
ここでも一応、紹介していきます。

bootstrapsのalertに組み合わせて表示させることが多いです。

以下がサンプルになります。

{% if messages %}
	<ul class="messages_ul">
		{% for message in messages %}
			<li class="alert{% if message.tags %} alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</li>
		{% endfor %}
	</ul>
{% endif %}

まとめ

まとめとして、今までのコードを書いていきます。
よろしければ参考にしてください。

ただしフォームは設定していないため
sample2.htmlも書いてないです。
ここは各自で適切なフォームとフォーム用のHTMLを書いてください。

views.py

from django.shortcuts import render, redirect
from django.contrib import messages

def sample(request):
    count = 'test'
    messages.debug(request, ' %s SQL statements were executed.' % count)
    messages.info(request, 'Three credits remain in your account.')
    messages.success(request, 'Profile details updated.')
    messages.warning(request, 'Your account expires in three days.')
    messages.error(request, 'Document deleted.')
    return render(request, 'sample.html')

def sample2(request):
    form = TestForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            message.success(request, 'フォームを送信しました')
            return redirect('sample')

urls.py

from . import views
from django.urls import path

urlpatterns = [
    path('sample/', views.sample, name='sample'),
    path('sample2/', views.sample, name='sample2'),
]

sample.html

{% if messages %}
	<ul class="messages_ul">
		{% for message in messages %}
			<li class="alert{% if message.tags %} alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</li>
		{% endfor %}
	</ul>
{% endif %}

では以上です。

タイトルとURLをコピーしました