メッセージに従ってみんなに

今日のWebアプリケーションでは、多くの場合、訪問者に警告を出す必要があります。 「コメントが保存され、モデレートを待っています」または「関心をお寄せいただきありがとうございます。開いたらすぐに招待状をお送りします」、これらの小さなメッセージは常にあちこちに表示されます。ユーザーに。



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つのステップのみ:
  1. 設定ファイルのMIDDLEWARE_CLASSESリストに「django.contrib.messages.middleware.MessageMiddleware」を追加します。
  2. 設定ファイルのTEMPLATE_CONTEXT_PROCESSORSリストに「django.contrib.messages.context_processors.messages」を追加します。
  3. 同じ設定ファイル内のINSTALLED_APPSリストに「django.contrib.messages」を追加します。


アラートを追加する



新しいフレームワークでユーザーにアラートを追加することも基本です。特に、5つの定義済みメッセージタイプ(DEBUG、INFO、SUCCESS、WARNING、ERROR-これについては後で説明します )の1つだけが必要な場合は重要です。



だからあなたは何をする必要があります:
  1. from django.contrib import messages messages.success(request, "Skadoosh! You've updated your profile!" )



  2. from django.contrib import messages messages.success(request, "Skadoosh! You've updated your profile!" )



同様に、他のタイプのメッセージの場合:
  1. 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. 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)



  3. 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)



  4. 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つの簡単なポイントを実行するだけで済みます。
  1. アラート生成が提供されるすべてのviews.pyファイルで、最初に次の行を追加します。

    from django.contrib import messages



  2. どこでも交換

    request.user.message_set.create(message=message)





    たとえば、新しいAPIのメソッドの1つを呼び出す

    messages.error(request, message)





メッセージ表示



テンプレートにメッセージを表示するには、次の行のようなものを使用します。
  1. {% if messages %} < ul class= "messages" > {% for message in messages %} < li {% if message.tags %} class= "{{ message.tags }}" {% endif %}> {{ message }} </ li > {% endfor %} </ ul > {% endif %}



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



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



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



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



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



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



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



  9. {% 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クラスの名前として表示します。これを使用して、さまざまなタイプのメッセージを個別にスタイル設定できます。次に例を示します。
  1. .messages li.error { background-color : red ; } .messages li.success { background-color : green ; }



  2. .messages li.error { background-color : red ; } .messages li.success { background-color : green ; }



ユーザーメッセージを表示するだけの場合は、読むことができなくなります。 実際、これ以上必要なものはありません。 すべてが簡単でシンプルです。





メッセージ保存メカニズム



Djangoには、メッセージを保存するためのバックエンドがいくつか用意されており、非常に簡単に独自のバックエンドを作成できます。 LegacyFallbackStorageはデフォルトで使用され、ほとんどのプロジェクトに適していますが、バックエンドを変更する理由はいくつかあります。

メッセージのタイプとタグ



前述のように、Djangoは5つの組み込みメッセージタイプを提供します。 各タイプは整数です。 既存のタイプを簡単に拡張または変更できます。 デフォルトでは次のものがあります。 独自のタイプを追加するには、定数を宣言し、add_message()メソッドを呼び出して新しいタイプメッセージを作成します。
  1. CRITICAL = 50 messages.add_message(request, CRITICAL, 'OH NOES! A critical error occured.' )



  2. CRITICAL = 50 messages.add_message(request, CRITICAL, 'OH NOES! A critical error occured.' )



もちろん、この情報をHTMLおよびCSSで使用する必要があるため、settings.pyファイルにMESSAGE_TAGS設定を追加して、文字列表現を新しいメッセージタイプに設定する必要があります。
  1. MESSAGE_TAGS = { 50 : 'critical' }





結論として



Django 1.2に含まれる新しいメッセージングシステムは、フレームワークの非常に複雑な部分ではありませんが、最新のWebアプリケーションが想像できない機能を提供し、非常にエレガントでシンプルにしています。 さらに、以前のバージョンと完全な互換性があるため、1.2に切り替えた後に古いコードやサードパーティのアプリケーションが壊れる心配はありません。 ただし、2027年の後半に計画されている1.4で互換性レイヤーが削除されることを忘れないでください。



冗談。 Django 1.2をお楽しみください! これは私たちの愛するフレームワークへの本当にクールなアップデートです。



-

Vimが作成した翻訳。



All Articles