使用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. Function-advanced

    函数进阶 1. 函数防抖 在频率触发的情况下 只有等待一定的时间才会触发 执行一次代码 特点 执行之前先清除之前的即将执行操作 保证只有最后一次生效 优化高频执行JS代码操作 提高性能 防抖代码实现 ...

  2. nginx概要

    新机(CentOS7)配置nginx: 一. 更新yum源为阿里云镜像 ping mirrors.aliyun.com mv /etc/yum.repos.d/CentOS-Base.repo /et ...

  3. elastic-job源码(1)- job自动装配

    版本:3.1.0-SNAPSHOT git地址:https://github.com/apache/shardingsphere-elasticjob   Maven 坐标 <dependenc ...

  4. Django笔记三十一之全局异常处理

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十一之全局异常处理 这一篇笔记介绍 Django 的全局异常处理. 当我们在处理一个 request 请求时,会尽可能的对接口数据的格式 ...

  5. 【性能】JDK和Jmeter的安装与配置

    一.JDK环境配置 1. 下载JDK 官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downl ...

  6. 超声波、毫米波、ToF激光雷达——在低功耗场景的应用选型

    前言: 目前主要的测距方式有:光学测距,超声波和微波雷达测距. 光学测距又可以分为:双目,结构光,ToF.微波雷达,在消费类产品中,常见的是波长在毫米级别的毫米波雷达.超声波应用比较多的是在车载倒车雷 ...

  7. MySQL对时间戳的格式化

    时间转时间戳 select unix_timestamp('2022-02-22 22:22:22'); 时间戳转时间 select from_unixtime(1645539742); 格式化 SE ...

  8. iview中时间选择器组件改变日期格式

    //改变视图的显示格式,但不会改变value的值的格式 format="yyyy-MM-dd" //改变value值的格式 @on-change="anZhuangDat ...

  9. 2023-03-17:使用Go语言和FFmpeg库实现音频重采样解码,并将其保存为PCM格式的文件。

    2023-03-17:使用Go语言和FFmpeg库实现音频重采样解码,并将其保存为PCM格式的文件. 答案2023-03-17: 在音视频处理领域,常常需要对音频进行重采样和解码,以便于后续的处理和分 ...

  10. 2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k

    2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false. 1 <= n, q <= 1 ...