Django message组件
使用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组件的更多相关文章
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
- python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- 9.24 Django Form组件
2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...
- django -----分页器组件
分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...
- element-ui Message组件源码分析整理笔记(八)
Message组件源码: main.js import Vue from 'vue'; import Main from './main.vue'; import { PopupManager } f ...
- element-ui中单独引入Message组件的问题
import Message from './src/main.js'; export default Message; 由于Message组件并没有install 方法供Vue来操作的,是直接返回的 ...
- Django - Xadmin 组件(一)
Django - Xadmin 组件(一) Web 应用中离不开的就是后台管理, Django 自带的 admin 组件提供了一部分内容,但往往现实项目中会有更多的需求,所以自定义自己的后台管理就十分 ...
- GUI的最终选择 Tkinter(八):Message组件、Spinbox组件、PanedWindow组件、Toplevel组件
Message组件 Message(消息)组件是Label组件的变体,用于显示多行文本消息,Message组件能够自动执行,并调整文本的尺寸使其适应给定的尺寸. from tkinter import ...
- Django forms组件里的ChoiceField、ModelChoiceField和ModelMutipleChoiceField的区别
阅读简要 首先我们要明白Django forms组件里的ChoiceField.ModelChoiceField和ModelMutipleChoiceField是继承关系 ChoiceField 1. ...
- Django—Form组件
Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...
随机推荐
- A-O-P 一篇概览
一.什么是AOP? AOP 即 Aspect-oriented Programming,Aspect 切面,什么是切面,就是一条大路上的收费站,检查站,首先它是一个统一的功能单元,或是收费.或是检查, ...
- 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置
目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 CH32V208 CH32V208系列是沁恒32位RISC-V中比较新的一个系列, 基于青稞RISC ...
- 继承 extends
首先是基础的继承关系,用extend就可以继承. 再者是继承的东西,包括:变量(也包括类变量).全部非私有的属性和方法(除了父类的构造方法) 注:构造方法 class C{ public C() { ...
- Pwn系列之Protostar靶场 Stack3题解
(gdb) disass main Dump of assembler code for function main: 0x08048438 <main+0>: push ebp 0x08 ...
- 2020-11-21:java中,什么是跨代引用?
福哥答案2020-11-21: [答案来自此链接:](http://bbs.xiangxueketang.cn/question/404) 跨代引用常出现与 CMS 分代收集时需要使用可达性分析判断对 ...
- mac -bash: ls: No such file or directory
再mac 输入ls 竟然提示我 如图其他到命令都不能用了??? 网上找了大半天.看见这种类似的很多,但是最后都不是我要的答案,最后没辙,注销用户,重新登陆,问题没有了,也不知道是不是mac的bug:有 ...
- 图解VirtualBox安装CentOS 7
VirtualBox简介 VirtualBox是由德国InnoTek软件公司出品的虚拟机软件,现在则由甲骨文公司进行开发,是甲骨文公司xVM虚拟化平台技术的一部分. VirtualBox提供用户在32 ...
- 【Python入门教程】获取图片可视化精准定位(逆地理编码)
使用exifread库读取图片的经纬度信息(WGS84坐标) 使用高德开放API将经纬度转为高德底图经纬度,并输出具体位置 使用folium库,以高德底图为基准,在网页上可视化显示地图和兴趣点 一 ...
- 自研ORM 完美支持 Exists查询 非常灵活
示例代码 Case 1 Code var data = db.Query<Product>() .Where(w => db.Query<Product>().Where ...
- youtobe深度学习推荐系统-学习笔记
简介 前言 本文是Deep Neural Networks for YouTube Recommendations 论文的学习笔记.淘宝的召回模型曾经使用过这篇论文里面的方案,后续淘宝召回模型升级到了 ...