Django 2.1.7 使用内置messages显示通知消息

2024-08-21 04:08

本文主要是介绍Django 2.1.7 使用内置messages显示通知消息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求

在Web应用程序中,有时候需要在处理表单或其他类型的用户输入后向用户显示一次性通知消息(也称为“flash消息”),例如:用户注册成功、订单提交完成等信息。

为此,Django为匿名和经过身份验证的用户提供对基于cookie和session存储数据的消息传递框架。该消息框架允许将消息临时存储在一个请求中并检索它们以便在后续请求(通常是下一个请求)中显示。每个消息被标记以特定的level确定其优先级(例如,info, warning,或error)。

这个消息框架的数据传递方式基本就是我上一篇Django 2.1.7 redirect重定向数据传输的问题
中使用session的参数传递方式。

Django官网文档

https://docs.djangoproject.com/zh-hans/2.1/ref/contrib/messages/

在项目settings启用内置messages消息框架

  • django.contrib.messages需要安装在应用INSTALLED_APPS中,如下:
INSTALLED_APPS = (...'django.contrib.messages', # django 内置的消息传递应用
)
  • 中间件MIDDLEWARE需要包含 'django.contrib.sessions.middleware.SessionMiddleware''django.contrib.messages.middleware.MessageMiddleware'
MIDDLEWARE = (....'django.contrib.sessions.middleware.SessionMiddleware',....'django.contrib.messages.middleware.MessageMiddleware',...
)

默认存储后端依赖于session。这就是为什么SessionMiddleware 必须启用在MessageMiddleware的前面。

  • TEMPLATES设置包含'django.contrib.messages.context_processors.messages'
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages', # 默认已有],},},
]

在视图和模板中使用消息

add_message(request,level,message,extra_tags ='',fail_silently = False)

添加消息

from django.contrib import messages
messages.add_message(request, messages.INFO, 'Hello world.')

还可以使用以下的快捷方法来添加具有常用标记的消息(通常表示为消息的HTML类):

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

显示消息

get_messages

在模板中,读取消息示例如下:

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

如果在视图中使用上下文处理器,则应使用 RequestContext。确保messages可用于模板上下文。

即使您知道只有一条消息,您仍应迭代messages序列,否则将不会为下一个请求清除消息存储。

上下文处理器还提供了一个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 %}

在模板之外,可以使用 get_messages()来获取消息:

from django.contrib.messages import get_messagesstorage = get_messages(request)
for message in storage:do_something_with_the_message(message)

例如,您可以获取所有消息以在JSONResponseMixin中返回它们 而不是 TemplateResponseMixin。

get_messages() 将返回已配置的存储后端的实例。

消息使用示例

在视图A发出一个messages消息记录,然后在视图B显示一次消息内容。

1)编写视图A,添加两个消息

from django.contrib import messagesdef send_alert_msg(request):# 添加消息messages.add_message(request, messages.SUCCESS, 'successful msg!!')messages.add_message(request, messages.ERROR, 'error msg!!')return redirect('assetinfo:show_msg')

2)编写视图B,转发显示消息内容

def show_msg(request):return render(request,'alert_msg/show_msg.html')

模板内容如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>{% if messages %}<ul class="messages">{% for message in messages %}<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>{% endfor %}</ul>{% endif %}<h4>通过tags判断messages类型</h4>{% if messages %}<ul class="messages">{% for message in messages %}{% if message.tags == "success" %}<li class="{{ message.tags }}">{{ message }}</li>{% elif message.tags == "error" %}<li class="{{ message.tags }}">{{ message }}</li>{% endif %}{% endfor %}</ul>{% endif %}</body>
</html>

3)在配置视图url

urlpatterns = [# ex:/assetinfo/send_alert_msgpath('send_alert_msg', views.send_alert_msg, name='send_alert_msg'),# ex:/assetinfo/show_msgpath('show_msg', views.show_msg, name='show_msg'),
]

4) 测试访问发送消息视图

在浏览器访问http://127.0.0.1:8000/assetinfo/send_alert_msg则自动重定向并显示消息如下:

13423234-d76be387d5062564.png

5) 直接再次访问接收消息视图

13423234-66bf67bb414bfa77.png

因为没有发送消息,所以消息接收为空。说明消息是一次性的,但是如果多次只发送不显示处理消息数据,则会在cookie或者session存储后端中堆积起来,在最后一次处理消息数据的时候一次性显示出来。

13423234-0e3934319aa622f6.png

这篇关于Django 2.1.7 使用内置messages显示通知消息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1092073

相关文章

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

MySQL分区表的具体使用

《MySQL分区表的具体使用》MySQL分区表通过规则将数据分至不同物理存储,提升管理与查询效率,本文主要介绍了MySQL分区表的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、分区的类型1. Range partition(范围分区)2. List partition(列表分区)3. H