標籤:迭代 constant important 覆蓋 art some 預設值 current add
在網頁應用中,我們經常需要在處理完表單或其它類型的使用者輸入後,顯示一個通知資訊給使用者。對於這個需求,Django提供了基於Cookie或者會話的訊息架構messages,無論是匿名使用者還是認證的使用者。這個訊息架構允許你臨時將訊息儲存在請求中,並在接下來的請求(通常就是下一個請求)中提取它們並顯示。每個訊息都帶有一個特定的level標籤,表示其優先順序(例如info、 warning或error)。一、啟用訊息架構Django的messages訊息架構的實現,依賴messages中介軟體和對應的context processor。通過django-admin startproject xxx命令建立工程時,已經預設在settings.py中開啟了訊息架構功能需要的所有的設定:
- INSTALLED_APPS中註冊的‘django.contrib.messages‘。
- MIDDLEWARE中添加‘django.contrib.sessions.middleware.SessionMiddleware‘和‘django.contrib.messages.middleware.MessageMiddleware‘。Django的messages架構預設使用的儲存後端為sessions。所以Session中介軟體必須被啟用,並出現在Message中介軟體之前。
- TEMPLATES設定中的DjangoTemplates選項包含的‘context_processors‘配置項要包含‘django.contrib.messages.context_processors.messages‘。
二、配置訊息引擎通常我們使用預設的就好,可以跳過這節,但如果真有需要,也可以配置:1. 儲存後端Django提供了三種內建的訊息儲存後端:class storage.session.SessionStorage class storage.cookie.CookieStorage class storage.fallback.FallbackStorageFallbackStorage是預設的儲存後端。如果它不適合你的需要,你可以通過設定MESSAGE_STORAGE選擇另外一個儲存後端,例如:MESSAGE_STORAGE = ‘django.contrib.messages.storage.cookie.CookieStorage‘2. 訊息層級訊息架構的層級是可配置的,與Python的logging模組類似Django內建的message層級有下面幾種:
| 層級 |
說明 |
| DEBUG |
將在生產部署中忽略(或刪除)的與開發相關的訊息 |
| INFO |
普通提示資訊 |
| SUCCESS |
成功資訊 |
| WARNING |
警告資訊 |
| ERROR |
已經發生的錯誤資訊 |
MESSAGE_LEVEL設定可以用來改變記錄的最小層級(參考前面的Django設定章節),小於這個層級的訊息將被忽略。3. 訊息樣式通常,我們在前端HTML頁面中,希望給不同層級的訊息,增加不同的CSS樣式,比如警告為黃色,error為紅色等等。Django為我們提供了一個預設的樣式對應關係:
| 層級 |
樣式 |
| DEBUG |
debug |
| INFO |
info |
| SUCCESS |
success |
| WARNING |
warning |
| ERROR |
error |
也就是說SUCCESS層級的訊息,在前端會被賦予一個success樣式class。若要修改訊息層級的預設樣式,設定MESSAGE_TAGS,按如下例子所示:。from django.contrib.messages import constants as messagesMESSAGE_TAGS = {messages.INFO: ‘‘,50: ‘critical‘,}三、使用訊息架構1. 添加訊息方法原型:add_message(request, level, message, extra_tags=‘‘, fail_silently=False)[source]新增一條訊息:from django.contrib import messagesmessages.add_message(request, messages.INFO, ‘Hello world.‘)提供請求對象request(直接用就行),訊息層級、訊息內容字串三個參數即可。或者使用下面的捷徑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.‘)2. 顯示訊息方法原型:get_messages(request)[source]在你的模板檔案中,像下面這樣使用:{% if messages %}<ul class="messages">{% for message in messages %}<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>{% endfor %}</ul>{% endif %}相關說明:
- 通過if判斷是否有訊息;
- messages是一個列表,必須用for標籤迴圈它;
- 即使你知道只有一條訊息,也要迭代messages列表,否則下個請求中,上個請求的訊息不會被清除。
- 可以通過message.tags拿到每個訊息的CSS樣式
有一個DEFAULT_MESSAGE_LEVELS變數,它映射訊息層級的名稱到它們的數值:{% if messages %}<ul class="messages">{% for message in messages %}<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}{{ message }}</li>{% endfor %}</ul>{% endif %}說明:
- 可以通過message.level拿到當前訊息的層級數值;
- 將它與DEFAULT_MESSAGE_LEVELS.ERROR進行對比;
- 如果一樣,就說明當前訊息層級為ERROR,需要顯示到頁面上。
在模板的外面,比如視圖中,可以使用get_messages()方法擷取訊息:from django.contrib.messages import get_messages storage = get_messages(request)for message in storage:do_something_with_the_message(message)說明:
- get_messages()返回的是儲存後端的一個執行個體。
- 迴圈這個執行個體,可以獲得每條訊息
對於每一個訊息執行個體,都包含下面的屬性,可以在模版或視圖中調用:
- message: 訊息的實際內容文本。不要使用message.message,直接message。
- level: 訊息層級,一個整數。
- tags: 一個字串,由該訊息的所有標籤(extra_tags和tags)組合而成,組合時用空格分割開這些標籤。
- extra_tags: 一個字串,由該訊息的定製標籤組合而成,並用空格分割。預設為空白。
- level_tag: 當前訊息層級對應的CSS字串,前面介紹過。
3. 自訂訊息層級訊息層級只是一個整數常量,所以,可以定義自己的層級常量,例如:CRITICAL = 50 def my_view(request):messages.add_message(request, CRITICAL, ‘A serious error occurred.‘)在自訂訊息層級時,應小心避免覆蓋現有層級。內建層級的值為:
| 層級 |
對應整數值 |
| DEBUG |
10 |
| INFO |
20 |
| SUCCESS |
25 |
| WARNING |
30 |
| ERROR |
40 |
如果你需要在HTML或CSS中使用自訂層級,則需要通過MESSAGE_TAGS設定提供相應的映射關係。4. 自訂每個請求的最小記錄層級每個請求都可以通過set_level()方法設定最小記錄層級,如下所示:from django.contrib import messages # 修改最小層級為DEBUGmessages.set_level(request, messages.DEBUG)messages.debug(request, ‘Test message...‘) # 在另外一個視圖中修改最小層級為WARNINGmessages.set_level(request, messages.WARNING)messages.success(request, ‘Your profile was updated.‘) # 被忽略,不記錄messages.warning(request, ‘Your account is about to expire.‘) # 記錄 # 將最小層級恢複到預設值messages.set_level(request, None)set_level()方法接收request為第一參數,訊息層級為第二參數。類似的,當前有效記錄層級可以用get_level()方法擷取:from django.contrib import messagescurrent_level = messages.get_level(request)5. 添加額外的訊息CSS樣式要添加自訂的訊息CSS樣式,可以通過extra_tags參數:messages.add_message(request, messages.INFO, ‘Over 9000!‘, extra_tags=‘dragonball‘)messages.error(request, ‘Email box full‘, extra_tags=‘email‘)四、訊息到期機制預設情況下,如果包含訊息的迭代器完成迭代後,當前請求中的訊息都將被刪除。如果你不想這麼做,想保留這些訊息,那麼需要顯式的指定used參數為False,如下所示:storage = messages.get_messages(request)for message in storage:do_something_with(message)storage.used = False
訊息架構 message