使用message组件要在seetings中配置

①INSTALLED_APPS   (项目需要什么功能都放在这 既可以有数据库,又可以写代码,html文件,和自己写的APP一个道理)

②MIDDLEWARE 中间件 (请求进来做什么,请求走的时候做什么)

③TEMPLATES  (模板,在html页面中操作方便)

④第四个位置可以放在任意地方 有三种配置(将数据保存在cookie中或session中,或者全部保存)

使用方法

设置值

第一个参数request .第二个参数 消息的级别,messages.SUCCESS不一定要这么写.第三个参数,自己写具体的参数.  以列表的形式存在

1 from django.contrib import messages
2 messages.add_message(reqeust, messages.SUCCESS, "删除成功")
3 messages.add_message(reqeust, messages.ERROR, "删除失败")

在视图中读取值(使用python代码)  循环读取到messages, 读取到的同时并删除 (类里面写的__iter__方法所以可以循环)

1 from django.contrib.messages.api import get_messages
2 messages = get_messages(request)
3 for msg in messages:
4 print(msg)

使用html代码读取值

<ul>
{% for message in messages %}
<li>{{ message.tags }} {{ message }}</li>
{% endfor %}
</ul>

源码分析

message是一个对象(包裹),可以包裹很多数据

 1 class Message:
2 """
3 Represent an actual message that can be stored in any of the supported
4 storage classes (typically session- or cookie-based) and rendered in a view
5 or template.
6 """
7
8 def __init__(self, level, message, extra_tags=None):
9 self.level = int(level)
10 self.message = message
11 self.extra_tags = extra_tags
12
13 def _prepare(self):
14 """
15 Prepare the message for serialization by forcing the ``message``
16 and ``extra_tags`` to str in case they are lazy translations.
17 """
18 self.message = str(self.message)
19 self.extra_tags = str(self.extra_tags) if self.extra_tags is not None else None
20
21 def __eq__(self, other):
22 if not isinstance(other, Message):
23 return NotImplemented
24 return self.level == other.level and self.message == other.message
25
26 def __str__(self):
27 return str(self.message)
28
29 @property
30 def tags(self):
31 return ' '.join(tag for tag in [self.extra_tags, self.level_tag] if tag)
32
33 @property
34 def level_tag(self):
35 return LEVEL_TAGS.get(self.level, '')

request,level,message分别对应设置值时候的参数,extra_tags='':可以自己写点东西,一般不用写.fail_silently=False,是在if not fail_silently 做的一个异常处理,也就是说如果有异常了安安静静的在那不要报错.

重点: messages = request._messages 在request中读取到了一个对象,return messages.add(level, message, extra_tags) 调用了messages.add,把这个三个参数传过去了.

request_messages是在'django.contrib.messages.middleware.MessageMiddleware' 这个中间件中定义的,看是在第四个位置中哪个存储的对象,SessionStorage对象(第四个位置设置的哪个就是那个对象)

所以messages = request._messages就是声明了一个SessionStorage的对象(第四个位置设置的哪个就是那个对象),SessionStorage源码中实例化了这个对象,下面有调用了messages.add(level, message, extra_tags)方法,SessionStorage这个类中没有message.add方法,在父类BaseStorage中,接收了三个参数def add(self, level, message, extra_tags='').最后封装给了message = Message(level, message, extra_tags=extra_tags), 总而言之绕了一圈,最终传入进来的值都会封装给Message对象

def add_message(request, level, message, extra_tags='', fail_silently=False):
"""
Attempt to add a message to the request using the 'messages' app.
"""
try:
    #SessionStorage的对象(第四个位置设置的哪个就是那个对象)
        messages = request._messages
"""
except AttributeError:
if not hasattr(request, 'META'):
raise TypeError(
"add_message() argument must be an HttpRequest object, not "
"'%s'." % request.__class__.__name__
)
if not fail_silently:
raise MessageFailure(
'You cannot add messages without installing '
'django.contrib.messages.middleware.MessageMiddleware'
)
"""
else:
return messages.add(level, message, extra_tags)

SessionStorage源码中实例化了这个对象

SessionStorage父类中

Message中

 1 class Message:
2 """
3 Represent an actual message that can be stored in any of the supported
4 storage classes (typically session- or cookie-based) and rendered in a view
5 or template.
6 """
7
8 def __init__(self, level, message, extra_tags=None):
9 self.level = int(level)
10 self.message = message
11 self.extra_tags = extra_tags
12
13 def _prepare(self):
14 """
15 Prepare the message for serialization by forcing the ``message``
16 and ``extra_tags`` to str in case they are lazy translations.
17 """
18 self.message = str(self.message)
19 self.extra_tags = str(self.extra_tags) if self.extra_tags is not None else None
20
21 def __eq__(self, other):
22 if not isinstance(other, Message):
23 return NotImplemented
24 return self.level == other.level and self.message == other.message
25
26 def __str__(self):
27 return str(self.message)
28
29 @property
30 def tags(self):
      # 自己的tag和通过extra传进来的tag都传进来通过空格拼接
31 return ' '.join(tag for tag in [self.extra_tags, self.level_tag] if tag)
32
33 @property
34 def level_tag(self):
35 return LEVEL_TAGS.get(self.level, '')



level_tag拿到的就是下面这个字典,在seetings中还可以自定义

DEFAULT_TAGS

Django message组件的更多相关文章

  1. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

  2. python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  3. 9.24 Django Form组件

    2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...

  4. django -----分页器组件

    分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...

  5. element-ui Message组件源码分析整理笔记(八)

    Message组件源码: main.js import Vue from 'vue'; import Main from './main.vue'; import { PopupManager } f ...

  6. element-ui中单独引入Message组件的问题

    import Message from './src/main.js'; export default Message; 由于Message组件并没有install 方法供Vue来操作的,是直接返回的 ...

  7. Django - Xadmin 组件(一)

    Django - Xadmin 组件(一) Web 应用中离不开的就是后台管理, Django 自带的 admin 组件提供了一部分内容,但往往现实项目中会有更多的需求,所以自定义自己的后台管理就十分 ...

  8. GUI的最终选择 Tkinter(八):Message组件、Spinbox组件、PanedWindow组件、Toplevel组件

    Message组件 Message(消息)组件是Label组件的变体,用于显示多行文本消息,Message组件能够自动执行,并调整文本的尺寸使其适应给定的尺寸. from tkinter import ...

  9. Django forms组件里的ChoiceField、ModelChoiceField和ModelMutipleChoiceField的区别

    阅读简要 首先我们要明白Django forms组件里的ChoiceField.ModelChoiceField和ModelMutipleChoiceField是继承关系 ChoiceField 1. ...

  10. Django—Form组件

    Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...

随机推荐

  1. java垃圾回收机制(面试)

    1.1堆空间结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配.同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收.Java 堆是垃圾收集器管理的主要区域,因此 ...

  2. C# 手写识别方案整理

    书写识别,网上的大佬们都有输出. 书写识别存在的2个问题: 直接拿官网的案例(将 Windows Ink 笔划识别为文本和形状 - Windows apps | Microsoft Learn),会发 ...

  3. PM系统成本科目挂接教程-如何查手册和看帮助文档

    如果这么简单的问题都无法入门只能说回炉重造吧孩子. ---by SheZQ 正文 成本科目挂接作为PM系统最基本的取数依据,数据汇总的根本,是必须要会的技能.如果没有挂接,就会出现空值或者0值. 摘自 ...

  4. 2020-12-28:java中,生产环境服务器变慢,如何诊断处理?

    福哥答案2020-12-28:答案1:使用 top 指令,服务器中 CPU 和 内存的使用情况,-H 可以按 CPU 使用率降序,-M 内存使用率降序.排除其他进程占用过高的硬件资源,对 Java 服 ...

  5. 2022-03-29:整个二维平面算是一张地图,给定[x,y],表示你站在x行y列, 你可以选择面朝的任何方向, 给定一个正数值angle,表示你视野的角度为, 这个角度内你可以看无穷远,这个角度外你

    2022-03-29:整个二维平面算是一张地图,给定[x,y],表示你站在x行y列, 你可以选择面朝的任何方向, 给定一个正数值angle,表示你视野的角度为, 这个角度内你可以看无穷远,这个角度外你 ...

  6. protoBuf 实现客户端与服务端

    转载请注明出处: 1.定义消息格式 在 src/main/proto 目录下创建 person.proto 文件,并定义消息格式,例如: syntax = "proto3"; pa ...

  7. [MAUI]在.NET MAUI中复刻苹果Cover Flow

    @ 目录 原理 3D旋转 平行变换 创建3D变换控件 绘制封面图片 应用3D旋转 应用平行变换 绘制倒影 创建绑定属性 创建绑定数据 创建布局 计算位置 计算3D旋转 创建动效 项目地址 Cover ...

  8. 5.5. Java并发工具类(如CountDownLatch、CyclicBarrier等)

    5.5.1 CountDownLatch CountDownLatch是一个同步辅助类,它允许一个或多个线程等待,直到其他线程完成一组操作.CountDownLatch有一个计数器,当计数器减为0时, ...

  9. [MAUI程序设计] 用Handler实现自定义跨平台控件

    @ 目录 Handler 与Xamarin.Forms实现的区别 为什么要用Handler代替Renderer 解耦 生命周期管理 更细粒度的控制 用Effect来实现呢? 自定义手势监听控件 在各平 ...

  10. CentOS 8 已是绝版?还有后续么?

    文章由 Linux爱好者( ID: LinuxHub)整理自开源中国 + 红帽官方.本文章经原作者同意后授权转载. 2020年12月8日,CentOS 项目宣布,CentOS 8 将于 2021 年底 ...