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标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比 ...
随机推荐
- 关于Java中对象的向上转型和向下转型
什么是多态? 同一个类调用同一个方法会产生不同的影响/结果 这就是多态 public class Pet{ public void eat(){ System.out.println("Pe ...
- 安装MongoDB、及基本使用
1.MongoDB简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,基于分布式文件存储的数据库.是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似json ...
- Python-解三元一次方程
需要解的方程组为: x + y + z = 26 x - y = 1 2x - y + z = 18 下面进入代码实现: 1.导入数学计算库 numpy import numpy as np 2.生成 ...
- Spring Boot 整合邮件服务
参考教程 首先参考了 Spring Boot整合邮件配置,这篇文章写的很好,按照上面的操作一步步走下去就行了. 遇到的问题 版本配置 然后因为反复配置版本很麻烦,所以参考了 如何统一引入 Spring ...
- 【Visual C#】基于《斗鱼弹幕服务器第三方接入协议v1.6.2》实现斗鱼弹幕服务器接入
最近在给某个主播开发斗鱼直播间辅助工具,为了程序的高效稳定,也搜索了大量的资料,经过大量什么百度,谷歌搜索... 虽然有很多Python的脚本及JS脚本实现了拉取斗鱼弹幕信息,但是这些年来的开发职业病 ...
- Mysql列转行, group_concat的使用
开始业务的查询的时候碰到一个sql的查询语句问题,主要是 group_concat 之前没用过,现在记录一下怎么用 group_concat 用法, 可以将相同的行组合起来 group_concat( ...
- 2021-04-19:手写代码:最小生成树算法之Kruskal。
2021-04-19:手写代码:最小生成树算法之Kruskal. 福大大 答案2021-04-19: 并查集.边从小到大,找最小边,无环. 代码用golang编写.代码如下: package main ...
- 给你安利一款国产良心软件uTools
前言 大家好,我是xiezhr 最近由于换了新电脑,也是在各种折腾搭建开发环境,安装各种常用软件.今天呢给大家安利一款你可能没用过的国产良心软件uTools,这也是我刚刚拿到电脑后安装的第一款软件吧. ...
- Visual Studio2019打开电脑摄像头
#include<iostream> //opencv头文件 #include<opencv2/opencv.hpp> using namespace std; using n ...
- Linux之从进程角度来理解文件描述符
文件描述符是一个非负整数,而内核需要通过这个文件描述符才可以访问文件.当我们在系统中打开已有的文件或新建文件时,内核每次都会给特定的进程返回一个文件描述符,当进程需要对文件进行读或写操作时,都要依赖这 ...