前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django 2.1.7 使用内置messages显示通知消息

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

作者头像
Devops海洋的渔夫
发布于 2019-08-22 11:24:53
发布于 2019-08-22 11:24:53
1.7K00
代码可运行
举报
文章被收录于专栏:Devops专栏Devops专栏
运行总次数:0
代码可运行

需求

在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中,如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = (
    ...
    'django.contrib.messages', # django 内置的消息传递应用
)
  • 中间件MIDDLEWARE需要包含 'django.contrib.sessions.middleware.SessionMiddleware''django.contrib.messages.middleware.MessageMiddleware'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MIDDLEWARE = (
    ....
    'django.contrib.sessions.middleware.SessionMiddleware',
    ....
    'django.contrib.messages.middleware.MessageMiddleware',
    ...
)

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

  • TEMPLATES设置包含'django.contrib.messages.context_processors.messages'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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', # 默认已有
            ],
        },
    },
]

在视图和模板中使用消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_message(request,level,message,extra_tags ='',fail_silently = False)

添加消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import messages
messages.add_message(request, messages.INFO, 'Hello world.')

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.')

显示消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get_messages

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% 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变量,它是消息级别名称到其数值的映射:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% 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()来获取消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib.messages import get_messages

storage = get_messages(request)
for message in storage:
    do_something_with_the_message(message)

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

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

消息使用示例

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import messages

def 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,转发显示消息内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def show_msg(request):
    return render(request,'alert_msg/show_msg.html')

模板内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
    # ex:/assetinfo/send_alert_msg
    path('send_alert_msg', views.send_alert_msg, name='send_alert_msg'),
    # ex:/assetinfo/show_msg
    path('show_msg', views.show_msg, name='show_msg'),
]

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.08.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
TVS和ESD那些事儿
过压脉冲如ESD和浪涌会对半导体器件产生不利影响,如导致绝缘击穿、功能停止或元件劣化。
ElectricDeveloper
2022/09/22
2.1K1
TVS和ESD那些事儿
想要深入了解EMC,看完这篇就差不多了!
电磁干扰(Electromagnetic Interference),简称EMI,有传导干扰和辐射干扰两种。传导干扰主要是电子设备产生的干扰信号通过导电介质或公共电源线互相产生干扰;辐射干扰是指电子设备产生的干扰信号通过空间耦合把干扰信号传给另一个电网络或电子设备。
AI 电堂
2020/07/27
2.6K0
想要深入了解EMC,看完这篇就差不多了!
电子元器件基础知识大全详解
对于电子行业的工程师来说,电子元件,就像人们入口的大米,每天都需要接触和使用。但事实上,许多工程师可能都不完全理解里面的门道。以下是工程师常用的十种电子元件以及相关的基本概念和知识。让我们一起学习了解一下。
电子交流圈
2022/03/21
1.4K0
什么是EMC?什么是EMI?什么是EMS?电磁兼容详解(一)
EMC(Electro Magnetic Compatibility,电磁兼容)是指电子、电气设备或系统在预期的电磁环境中,按设计要求正常工作的能力。它是电子、电气设备或系统的一种重要的技术性能,其包括三方面的含义:
利又德智能感知
2023/04/11
12.4K0
什么是EMC?什么是EMI?什么是EMS?电磁兼容详解(一)
RS485通信如何设计EMC电路?
在实际工业和仪器仪表(I&I)应用中,RS-485接口链路需要在恶劣电磁环境下工作。雷击、静电放电和其他电磁现象引起的大瞬变电压可能损坏通信端口。为了确保这些数据端口能够在最终安装环境中正常 工作,它们必须符合某些电磁兼容性(EMC)法规。
不脱发的程序猿
2021/08/10
1.1K0
干货|详解消灭EMC的三大利器:电容器/电感/磁珠
滤波电容器、共模电感、磁珠在EMC设计电路中是常见的身影,也是消灭电磁干扰的三大利器。
MCU起航
2020/08/04
7880
干货|详解消灭EMC的三大利器:电容器/电感/磁珠
设计低泄漏飞安电路,第 2 部分:组件选择
第1部分定义并描述了承载这些低电流的设计,解释了设计这些电路时出现的问题,并研究了屏蔽和防护方法的应用。在第 2 部分中,将研究元件选择如何影响低泄漏电路的性能,并讨论噪声如何渗透到低泄漏设计中。
云深无际
2024/08/20
1610
设计低泄漏飞安电路,第 2 部分:组件选择
网络设备为什么要防雷?防雷可不是小事,作为网工一定不要马虎!
雷电,这一地球大气中震撼人心的剧烈放电现象,长久以来激发着人类无尽的敬畏之心。然而,随着科技的飞速进步与社会的蓬勃发展,我们已构建起由计算机、各类网络及通信设备交织而成的“信息高速公路”,极大地丰富了信息交流与传递的方式。
ICT系统集成阿祥
2024/12/03
1980
网络设备为什么要防雷?防雷可不是小事,作为网工一定不要马虎!
浅谈EMC电磁兼容设计—概念篇
EMC(Electro Magnetic Compatibility)——电磁兼容,是指电子、电气设备或系统在预期的电磁环境中,按设计要求正常工作的能力。就世界范围来说,电磁兼容性问题已经形成一门新的学科,也是一门以电磁场理论为基础,包括信息、电工、电子、通信、材料、结构等学科的边缘科学,同时也是一门实践性比较强的学科,需要产品工程师具有丰富的实践知识。
不脱发的程序猿
2021/01/20
1.1K0
今日说“法”:上拉、下拉电阻那点事
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
9920
今日说“法”:上拉、下拉电阻那点事
电磁兼容(EMC)的标准与测试内容
在国际范围上,电磁兼容标准的制定已经有了70多年的发展历程,最早为了保护无线电通信和广播,国际无线电干扰特别委员会(CISPR)对各种用电设备和系统提出了相关的电磁干扰发射限值和测量方法。到了20世纪60~70年代,由于电子、电气设备的小型化、数字化和低功耗化,人们开始考虑设备的抗干扰能力,世界各大标准化组织和各国政府机构也相继制定了许许多多的电磁兼容标准。咱们今天就和海翎光电的小编一起来聊聊电磁兼容的基础知识和测试内容。
利又德智能感知
2023/02/03
2.7K0
电磁兼容(EMC)的标准与测试内容
常用电子元器件基本知识整理
它是导体的一种基本性质,与温度、材质、尺寸、横截面积相关。。电阻的主要物理特征是把电能变为热能,也可说它是一个耗能元件,电流经过它就产生内能,所以注意在选用电阻的时候要算一下电路的流过的电流,并选用合适功率的电阻,防止电阻由于过度发热产生不必要的麻烦。
电子交流圈
2022/03/21
6320
详解EMC测试国家标准GB/T 17626
最近公司的几块板子要做认证,EMC测试自然是少不了,既然要做试验,就要有一个标准,是消费电子、工业控制,还是汽车电子、军工电子,这些工作环境所要求的EMC测试标准是不同的,每个试验又分为了很多的等级。接触静电是要做到6kV还是8kV,空气放电是要做到8kV还是15kV?我的产品要做哪些EMC试验?要做到什么等级?一起来了解一下关于EMC测试的国家标准吧!上一篇文章介绍了《详解电子产品认证类型》,本文介绍EMC测试中涉及的GB/T17626系列相关国家标准,文末有GB/T17626国家标准电子文档下载地址。
单片机点灯小能手
2020/07/16
3.1K0
电子元件-TVS与肖特基二极管
内容包括瞬态抑制二极管与肖特基二极管的一般介绍,详述普通二极管与肖特基二极管的恢复时间,肖特基二极管在开关电源与反向保护中的应用。持续更新,CSDN爱上电路设计原创!
爱上电路设计
2023/09/05
5020
电子元件-TVS与肖特基二极管
eFuse电子保险丝,需要了解的技术干货来啦
eFuse基于一个简单概念,即通过测量已知电阻器上的电压来检测电流,然后在电流超过设计限值时,通过场效应晶体管(FET)切断电流。eFuse具有热保险丝无法实现特性、灵活性和功能。
芯动大师
2024/06/14
1.5K2
eFuse电子保险丝,需要了解的技术干货来啦
高级硬件工程师设计电路考虑的问题有哪些区别?
1、 D1在大多数CMOS集成电路中起着防静电功能.同时辅助起着输入端限幅作用。但是在ABT,LVT,LVC和AHC/AHCT类集成电路中无此二极管。
硬件开源小站
2024/11/07
1220
104条PCB 布局布线技巧问答
2、[问] 在布板时,如果线密,过孔就可能要多,当然就会影响板子的电气性能,请问怎样提高板子的电气性能?
硬件开源小站
2023/04/14
1.3K1
现代医学电子仪器原理与设计实验.电阻电容电感
去年就买这本书了,我顺手就揣回来了,上面说了几个仪器,我觉得还挺综合,让我们在年末为来一次收官活动。
云深无际
2024/12/25
970
现代医学电子仪器原理与设计实验.电阻电容电感
55条数字模拟电路总结
不是学这个得,但是一直是一个这方面得爱好者,整理一些笔记,记录一下 1、HC为COMS电平,HCT为TTL电平 2、LS输入开路为高电平,HC输入不允许开路,HC一般都要求有上下拉电阻来确定输入端无
云深无际
2021/04/14
9360
55条数字模拟电路总结
电容与部分电容_接地电容不能太大
电容,和电感、电阻一起,是电子学三大基本无源器件;电容的功能就是以电场能的形式储存电能量。
全栈程序员站长
2022/09/23
1.2K0
电容与部分电容_接地电容不能太大
推荐阅读
相关推荐
TVS和ESD那些事儿
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档