DjangoでrailsのFlashメッセージと同じことをしたい
Djangoでリダイレクト先にメッセージを表示したくて調べてみました。
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 %}