DjangoでrailsのFlashメッセージと同じことをしたい

Djangoでリダイレクト先にメッセージを表示したくて調べてみました。

Railsでいうflashメッセージみたいな機能です。

railsでの開発からちょっと離れているのですが、たしかこんな感じで、コントローラに記述すれば、リダイレクト先でhogeを表示できた

flash[:notice] = "hoge"
redirect_to :root


djangoで同じことをやろうとして、調べてみるとmessage frameworkというのがあって、それが同等の機能を提供してくれるようです。

https://docs.djangoproject.com/en/dev/ref/contrib/messages/



ドキュメントに書いてあるまんまですが、せっかく調べたので使う際の手順をまとめておくと


1. MIDDLEWARE_CLASSESに'django.contrib.messages.middleware.MessageMiddleware'を追加

MessageMiddlewareはSessionMiddlewareよりも後に記述する必要がある

MIDDLEWARE_CLASSES = (
    #~~
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",

)


2. TEMPLATE_CONTEXT_PROCESSORSに'django.contrib.messages.context_processors.messages'を追加

TEMPLATE_CONTEXT_PROCESSORS = (
    #~~
    'django.contrib.messages.context_processors.messages',

)


3. INSTALLED_APPSに'django.contrib.messages'を追加

INSTALLED_APPS = (
    #~~
    'django.contrib.messages',

)


4. MESSAGE_STORAGEを設定

MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'

cookieを使う場合は上記のCookieStorage。
Sessionを使う場合は'django.contrib.messages.storage.session.SessionStorage'。

SessionSotrageを使う場合は INSTALLED_APPSに'django.contrib.sessions'が必要

基本CookieStorageを使い、それで賄い切れない場合はSessionStorageを使う'django.contrib.messages.storage.fallback.FallbackStorage'というのもあります

極端に長い文字列をメッセージを使わないならCookieStorageで十分っぽいですね



とここまで書きましたが、1-3はDjango 1.4だと全部startprojectした時点で使える状態に設定されてました



あとは使い方


view関数で設定

from django.contrib import messages

messages.success(request, '成功しました')

successの他に、debug、info、warning、errorが使えます。

使ったメッセージレベルによって、messages.tagsが変化するので、それでメッセージ表示領域のスタイルを制御するんですね

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