Djangoに付属の認証および承認アプリケーション(django.contrib.auth)には、ユーザーにポップアップメッセージを表示するための基本的な機能が常に含まれていましたが、いくつかの迷惑な欠点がありました。 Django 1.2は、主にTobias McNultyによって書かれた、そのようなメッセージのための完全に新しいフレームワークを備えています。
では、古い方法の何が問題になったのでしょうか?
古いメッセージングシステムはdjango.contrib.authの一部であるため、このアプリケーションを接続して、アラートを処理する小さな部分を利用する必要があります。 ただし、認証と承認は必要ありませんが、これらの小さなメッセージは必要です。 または、独自の認証アプリケーションを使用している可能性があります。 または、逆に、django.contrib.authを使用しますが、メッセージは必要ありません。 Django 1.2では、最終的にこれらすべての機会を得ることができます。
さらに、古いシステムはデータベースにメッセージを保存します。 多くのプロジェクトではこれは正常ですが、それでも、ページを表示するたびにデータベースへの追加のクエリが伴うことを意味します。 そして、ほとんどの場合それは単に必要ではありません。 Django 1.2では、パフォーマンスをわずかに向上させるために、データベースの外部にメッセージを保存する機能が導入されました。
また、以前のバージョンのDjangoでは、すべてのメッセージが等しいと見なされていたことにも注意してください。 メッセージタイプを設定することは不可能でした(必要に応じて重要度レベル)。 これは、たとえば、エラーメッセージと成功を区別する必要がある場合に便利です。 新しいフレームワークでは、そのような機会が現れました。
最後に、Django 1.1の通知システムは、各メッセージを特定のユーザーと密接に関連付けています。つまり、このようなメッセージを匿名ユーザーに表示することはできません。 Django 1.2には、ユーザーがログインしているかどうかに関係なく、アラートを表示する機能もあります。
それでは始めましょう。
django-admin.py startprojectを使用してプロジェクトを作成すると、新しいシステムはデフォルトですでに接続されています。 既に古いプロジェクトがある場合、または他の方法でプロジェクトを作成した場合、システムの電源を入れるのは非常に簡単です。 3つのステップのみ:
- 設定ファイルのMIDDLEWARE_CLASSESリストに「django.contrib.messages.middleware.MessageMiddleware」を追加します。
- 設定ファイルのTEMPLATE_CONTEXT_PROCESSORSリストに「django.contrib.messages.context_processors.messages」を追加します。
- 同じ設定ファイル内のINSTALLED_APPSリストに「django.contrib.messages」を追加します。
アラートを追加する
新しいフレームワークでユーザーにアラートを追加することも基本です。特に、5つの定義済みメッセージタイプ(DEBUG、INFO、SUCCESS、WARNING、ERROR-これについては後で説明します )の1つだけが必要な場合は重要です。
だからあなたは何をする必要があります:
-
from django.contrib import messages messages.success(request, "Skadoosh! You've updated your profile!" )
-
from django.contrib import messages messages.success(request, "Skadoosh! You've updated your profile!" )
-
messages.info(request, 'Yo! There are new comments on your photo!' ) messages.error(request, 'Doh! Something went wrong.' ) messages.debug(request, 'Bam! %s objects were modified.' % modified_count) messages.warning(request, 'Uh-oh. Your account expires in %s days.' % expiration_days)
-
messages.info(request, 'Yo! There are new comments on your photo!' ) messages.error(request, 'Doh! Something went wrong.' ) messages.debug(request, 'Bam! %s objects were modified.' % modified_count) messages.warning(request, 'Uh-oh. Your account expires in %s days.' % expiration_days)
-
messages.info(request, 'Yo! There are new comments on your photo!' ) messages.error(request, 'Doh! Something went wrong.' ) messages.debug(request, 'Bam! %s objects were modified.' % modified_count) messages.warning(request, 'Uh-oh. Your account expires in %s days.' % expiration_days)
-
messages.info(request, 'Yo! There are new comments on your photo!' ) messages.error(request, 'Doh! Something went wrong.' ) messages.debug(request, 'Bam! %s objects were modified.' % modified_count) messages.warning(request, 'Uh-oh. Your account expires in %s days.' % expiration_days)
古いバージョンからアップグレードする場合、2つの簡単なポイントを実行するだけで済みます。
- アラート生成が提供されるすべてのviews.pyファイルで、最初に次の行を追加します。
from django.contrib import messages
- どこでも交換
request.user.message_set.create(message=message)
たとえば、新しいAPIのメソッドの1つを呼び出す
messages.error(request, message)
メッセージ表示
テンプレートにメッセージを表示するには、次の行のようなものを使用します。
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
-
{% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}
このコードは、Django 1.1で既に使用しているものとほとんど同じですが、新しいタグプロパティに注意してください。 Django 1.2は、各アラートに、テンプレートで使用するための文字列表現を持つタイプを提供します。 この場合、この値をCSSクラスの名前として表示します。これを使用して、さまざまなタイプのメッセージを個別にスタイル設定できます。次に例を示します。
-
.messages li.error { background-color : red ; } .messages li.success { background-color : green ; }
-
.messages li.error { background-color : red ; } .messages li.success { background-color : green ; }
メッセージ保存メカニズム
Djangoには、メッセージを保存するためのバックエンドがいくつか用意されており、非常に簡単に独自のバックエンドを作成できます。 LegacyFallbackStorageはデフォルトで使用され、ほとんどのプロジェクトに適していますが、バックエンドを変更する理由はいくつかあります。
- django.contrib.messages.storage.session.SessionStorage。 このバックエンドは、セッション内のすべてのメッセージを保存します。 したがって、django.contrib.sessionsアプリケーションを接続する必要があります(デフォルトで使用されるため、プロジェクトで既にアクティブ化されている可能性が高い)。 セッションはデフォルトでデータベースに保存されるため、このバックエンドを使用するには、メッセージにアクセスするときにデータベースへのクエリが必要です(たとえば、テンプレートで{%if messages%}が呼び出される場合)。
- django.contrib.messages.storage.cookie.CookieStorageは、メッセージをクッキーに保存します。 したがって、データベースクエリは不要で、パフォーマンスが向上します。 ただし、1つの欠点があります。Cookieの最大長は4096バイトであるため、4 KBを超えるメッセージは配信されません。
- django.contrib.messages.storage.fallback.FallbackStorage:このメカニズムは最初にCookieStorageを使用しますが、テキストがCookieに収まらない場合、SessionStorageにアクセスします。
- django.contrib.messages.storage.user_messages.LegacyFallbackStorage。 Django 1.1以前との後方互換性のために提供されています。 FallbackStorageと同様に機能しますが、古いアラートシステムdjango.contrib.authからのメッセージも受信します。 ただし、django.contrib.authのシステム自体と同様に、このメカニズムは非推奨であり、Django 1.4から削除されます。 このメカニズムはデフォルトで使用されますが、削除されるとすぐに、FallbackStorageによって置き換えられます。
メッセージのタイプとタグ
前述のように、Djangoは5つの組み込みメッセージタイプを提供します。 各タイプは整数です。 既存のタイプを簡単に拡張または変更できます。 デフォルトでは次のものがあります。
- デバッグ:10
- 情報:20
- 成功:25
- 警告:30
- エラー:40
-
CRITICAL = 50 messages.add_message(request, CRITICAL, 'OH NOES! A critical error occured.' )
-
CRITICAL = 50 messages.add_message(request, CRITICAL, 'OH NOES! A critical error occured.' )
-
MESSAGE_TAGS = { 50 : 'critical' }
結論として
Django 1.2に含まれる新しいメッセージングシステムは、フレームワークの非常に複雑な部分ではありませんが、最新のWebアプリケーションが想像できない機能を提供し、非常にエレガントでシンプルにしています。 さらに、以前のバージョンと完全な互換性があるため、1.2に切り替えた後に古いコードやサードパーティのアプリケーションが壊れる心配はありません。 ただし、2027年の後半に計画されている1.4で互換性レイヤーが削除されることを忘れないでください。
冗談。 Django 1.2をお楽しみください! これは私たちの愛するフレームワークへの本当にクールなアップデートです。
-
Vimが作成した翻訳。