Python中引用类型的应用(Django系列2)
来源:互联网 发布:知乎 军工 编辑:程序博客网 时间:2024/06/06 03:02
博客核心内容:
1、Python中的引用类型2、应用1-多级评论3、应用2-简单后台管理菜单
示例程序1:
#!/usr/bin/python# -*- coding:utf-8 -*-v = [ {'id':1,'name':'alex'}, {'id':2,'name':'egon'}, {'id':3,'name':'eric'},]for row in v: row['email'] = '1743736@qq.com'for row in v: print(row)
运行结果:
{'name': 'alex', 'id': 1, 'email': '1743736@qq.com'}{'name': 'egon', 'id': 2, 'email': '1743736@qq.com'}{'name': 'eric', 'id': 3, 'email': '1743736@qq.com'}
示例程序2:
#!/usr/bin/python# -*- coding:utf-8 -*-"""在上面的例子当中,v1和v2相当于指针变量,指向同一块内存空间."""v1 = [1,2,3,4]v2 = v1v1.append(5)print(v1,v2)
运行结果:
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
内存分配示意图:一共分配了3块内存空间.
示例程序3:
#!/usr/bin/python# -*- coding:utf-8 -*-"""v1 = 1234分配一块内存空间v1 = [1,2,3,4]分配两块内存空间"""v1 = 1234v2 = v1v1 = 4567print(v1)print(v2)
运行结果:
45671234
分析:从内存分配的角度来讲,v1=1234由操作系统只分配了一块内存空间,并且给这块内存空间起了一个别名v1,随后又给这块内存空间又起了一个别名v2,随后v1=4567由操作系统又分配了一块内存空间,并且v1与原来的内存空间进行解绑,整个过程中只分配了两块内存空间。
内存分配示意图:
示例程序4:(难)
#!/usr/bin/python# -*- coding:utf-8 -*-v1 = [ {'id':1,'child':[]}, {'id':2,'child':[]}]v1[0]['child'].append(v1[1])v1[1]['child'].append('alex')for item in v1: print(item)
运行结果:
{'child': [{'child': ['alex'], 'id': 2}], 'id': 1}{'child': ['alex'], 'id': 2}
从运行结果来看,v1[1][‘child’]的变化将导致v1[0][‘child’]的动态变化。
接下来我们谈一下具体的应用:如何利用引用类型获取结构化的数据.
#!/usr/bin/python# -*- coding:utf-8 -*-"""comment_list = models.Comment.objects.filter(news_id=1).values('nid','news_id','user_info_id','content','parent_id')得到的结果:"""comment_list = [ {'id':1,'news_id':1,'user_id':10,'content':'写的什么玩意啊','parent_id':None}, {'id':2,'news_id':1,'user_id':11,'content':'还真不是什么玩意','parent_id':1}, {'id':3,'news_id':1,'user_id':12,'content':'写的真好','parent_id':1}, {'id':4,'news_id':1,'user_id':11,'content':'我总算看明白了,原来是因为我智商低','parent_id':3}, {'id':5,'news_id':1,'user_id':19,'content':'还可以吧','parent_id':None}, ]# 步骤1:comment_dict = {}for row in comment_list: #先给每一条评论增加上一个字段child row['child'] = [] comment_dict[row['id']] = rowfor item in comment_dict.items(): print(item)"""(1, {'user_id': 10, 'parent_id': None, 'id': 1, 'child': [], 'content': '写的什么玩意啊', 'news_id': 1})(2, {'user_id': 11, 'parent_id': 1, 'id': 2, 'child': [], 'content': '还真不是什么玩意', 'news_id': 1})(3, {'user_id': 12, 'parent_id': 1, 'id': 3, 'child': [], 'content': '写的真好', 'news_id': 1})(4, {'user_id': 11, 'parent_id': 3, 'id': 4, 'child': [], 'content': '我总算看明白了,原来是因为我智商低', 'news_id': 1})(5, {'user_id': 19, 'parent_id': None, 'id': 5, 'child': [], 'content': '还可以吧', 'news_id': 1})"""#步骤二:最重要的一步for row in comment_list: if row['parent_id']: #如果该评论拥有父评论,则添加到父亲的child列表当中 parent_id = row['parent_id'] # 因为append,所以是同一块内存空间 comment_dict[parent_id]['child'].append(row) else: passfor item in comment_dict.items(): print(item)"""(1, {'news_id': 1, 'child': [{'news_id': 1, 'child': [], 'content': '还真不是什么玩意', 'parent_id': 1, 'user_id': 11, 'id': 2}, {'news_id': 1, 'child': [{'news_id': 1, 'child': [], 'content': '我总算看明白了,原来是因为我智商低', 'parent_id': 3, 'user_id': 11, 'id': 4}], 'content': '写的真好', 'parent_id': 1, 'user_id': 12, 'id': 3}], 'content': '写的什么玩意啊', 'parent_id': None, 'user_id': 10, 'id': 1})(2, {'news_id': 1, 'child': [], 'content': '还真不是什么玩意', 'parent_id': 1, 'user_id': 11, 'id': 2})(3, {'news_id': 1, 'child': [{'news_id': 1, 'child': [], 'content': '我总算看明白了,原来是因为我智商低', 'parent_id': 3, 'user_id': 11, 'id': 4}], 'content': '写的真好', 'parent_id': 1, 'user_id': 12, 'id': 3})(4, {'news_id': 1, 'child': [], 'content': '我总算看明白了,原来是因为我智商低', 'parent_id': 3, 'user_id': 11, 'id': 4})(5, {'news_id': 1, 'child': [], 'content': '还可以吧', 'parent_id': None, 'user_id': 19, 'id': 5})"""#步骤三:清洗数据,获取最终的结果comment_result = {}for k,v in comment_dict.items(): if v['parent_id'] == None: comment_result[k] = vprint(comment_result.__len__())for item in comment_result.items(): print(item)"""2(1, {'news_id': 1, 'child': [{'news_id': 1, 'child': [], 'content': '还真不是什么玩意', 'parent_id': 1, 'user_id': 11, 'id': 2}, {'news_id': 1, 'child': [{'news_id': 1, 'child': [], 'content': '我总算看明白了,原来是因为我智商低', 'parent_id': 3, 'user_id': 11, 'id': 4}], 'content': '写的真好', 'parent_id': 1, 'user_id': 12, 'id': 3}], 'content': '写的什么玩意啊', 'parent_id': None, 'user_id': 10, 'id': 1})(5, {'news_id': 1, 'child': [], 'content': '还可以吧', 'parent_id': None, 'user_id': 19, 'id': 5})"""
最终得到的下面的结果就是我们想要的:
(1, {'id': 1,'user_id': 10, 'news_id': 1,'content': '写的什么玩意啊','parent_id': None, 'child': [ { 'id': 2,'user_id': 11, 'news_id': 1,'content': '还真不是什么玩意', 'child': [], 'parent_id': 1,}, { 'id': 3,'user_id': 12, 'news_id': 1,'content': '写的真好', 'parent_id': 1, 'child': [{'id': 4, 'user_id': 11, 'news_id': 1, 'parent_id': 3, 'content': '我总算看明白了,原来是因为我智商低', 'child': []}], }], })(5, {'user_id': 19, 'content': '还可以吧', 'child': [], 'parent_id': None, 'news_id': 1, 'id': 5})
前端页面多级评论的展示:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> .comment > .content { margin-left: 30px; color: red; font-weight: 700; } </style></head><body><h3>今天上海渡劫的视频真给力啊?</h3><div class="comment"> <div class="content"> <div class="item">一级评论</div> <div class="item">一级评论</div> <div class="comment"> <div class="content"> <div class="item">二级评论</div> <div class="comment"> <div class="content"> <div class="item">三级评论</div> <div class="item">三级评论</div> </div> </div> <div class="item">二级评论</div> </div> </div> <div class="item">一级评论</div> <div class="item">一级评论</div> </div></div></body></html>
运行效果:
递归生成相应的评论:
代码
def create_child_node(child_comment): """ function:创建一个评论的子评论,用到了递归 :return: """ prev = """ <div class="comment"> <div class="content"> """ for child in child_comment: tpl = '<div class="item">%s</div>' content = tpl % child['content'] prev = prev + content if child['child']: node = create_child_node(child['child']) prev = prev + node end = """ </div> </div> """ return prev+enddef create_html(comment_result): """ :param comment_result: comment_result参数是我们最终得到的结构化数据 :return: 可以获取到我们的父级评论:谁有子评论,在他的下面加一个comment+content """ prev = """ <div class="comment"> <div class="content"> """ # 我们先获取父级评论 for k,v in comment_result.items(): tpl = '<div class="item">%s</div>' content = tpl %v['content'] prev = prev + content if v['child']: node = create_child_node(v['child']) prev = prev + node end = """ </div> </div> """ print(prev+end) return prev+enddef comment(request): """ function:本程序的目的是为了模拟多级评论 ID 新闻ID 用户ID 评论的内容 parent_id 1 1 10 写的什么玩意啊 null 2 1 11 还真不是什么玩意 1 3 1 12 写的真好 1 4 1 11 我总算看明白了,原来是因为我智商低 3 comment_list = Comment.objects.filter(news_id=1) """ # models.Comment.objects.filter(news_id=1).values('nid','news_id','user_info_id','content','parent_id') comment_list = [ {'id': 1, 'news_id': 1, 'user_id': 10, 'content': '写的什么玩意啊', 'parent_id': None}, {'id': 2, 'news_id': 1, 'user_id': 11, 'content': '还真不是什么玩意', 'parent_id': 1}, {'id': 3, 'news_id': 1, 'user_id': 12, 'content': '写的真好', 'parent_id': 1}, {'id': 4, 'news_id': 1, 'user_id': 11, 'content': '我总算看明白了,原来是因为我智商低', 'parent_id': 3}, {'id': 5, 'news_id': 1, 'user_id': 19, 'content': '还可以吧', 'parent_id': None}, {'id': 6, 'news_id': 1, 'user_id': 20, 'content': '有点意思', 'parent_id':3}, ] comment_dict = {} for row in comment_list: row['child'] = [] comment_dict[row['id']] = row for row in comment_list: if row['parent_id']: # 如果该评论拥有父评论,则添加到父亲的child列表当中 parent_id = row['parent_id'] comment_dict[parent_id]['child'].append(row) else: pass # 获取我们最终的结果 comment_result = {} for k, v in comment_dict.items(): if v['parent_id'] == None: comment_result[k] = v for item in comment_result.items(): print(item) # 随后我们将comment_result显示到前端页面:在我们后台生成相应的评论内容 comment_str = create_html(comment_result) return render(request, 'comment.html',{'comment_str':comment_str})
前端页面:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> .comment > .content { margin-left: 30px; color: red; font-weight: 700; } </style></head><body><h3>今天上海渡劫的视频真给力啊?</h3>{{ comment_str|safe }}</body></html>
运行效果:
简单后台管理菜单:
核心代码:
1、模板语言
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> body{ margin: 0px; } .page-header{ height: 48px; background-color: firebrick; } .page-body .menu{ position: absolute; top:48px; left: 0px; bottom: 0px; width: 150px; background-color: red; } .page-body > .content{ left: 150px; top:48px; bottom: 0px; right: 0px; background-color: white; position: absolute; overflow: auto; } .menu .menu_item{ display: block; padding: 15px 38px; border: solid 1px #dddddd; } .menu .active{ background-color: blue; } </style></head><body><div class="page-header"></div><div class="page-body"> <div class="menu"> <a id="menu_order" href="/backend/order/" class="menu_item">订单管理</a> <a id="menu_user" href="/backend/user/" class="menu_item">用户管理</a> <a id="menu_host" href="/backend/host/" class="menu_item">主机管理</a> </div> <div class="content"> {% block content %} {% endblock %} </div></div></body></html>
2、继承代码
{% extends '_layout.html' %}{% load staticfiles %}{% block content %} <h1>订单欢迎你...</h1> <script src="{% static "js/jquery-1.11.3.min.js" %}"></script> <script> {# 页面框架加载完之后,则自动执行下面的函数 #} $(function () { {# $('#menu_host').addClass('active')#} {# $('#menu_host').siblings().removeClass('active')#} $('#menu_order').addClass('active').siblings().removeClass('active') }) </script>{% endblock %}
{% extends '_layout.html' %}{% load staticfiles %}{% block content %} <h1>主机欢迎你...</h1> <script src="{% static "js/jquery-1.11.3.min.js" %}"></script> <script> {# 页面框架加载完之后,则自动执行下面的函数 #} $(function(){{# $('#menu_host').addClass('active')#}{# $('#menu_host').siblings().removeClass('active')#} $('#menu_host').addClass('active').siblings().removeClass('active') }) </script>{% endblock %}
{% extends '_layout.html' %}{% load staticfiles %}{% block content %} <h1>用户欢迎你...</h1> <script src="{% static "js/jquery-1.11.3.min.js" %}"></script> <script> {# 页面框架加载完之后,则自动执行下面的函数 #} $(function () { {# $('#menu_host').addClass('active')#} {# $('#menu_host').siblings().removeClass('active')#} $('#menu_user').addClass('active').siblings().removeClass('active') }) </script>{% endblock %}
效果展示:
阅读全文
1 0
- Python中引用类型的应用(Django系列2)
- Python引用2(Django系列3)
- python的Django框架应用(2)
- Python中Django后端应用
- Python的Django框架应用(1)
- 菜鸟学Python(11):在Django中怎么下载任意类型的文件?
- 菜鸟学Python(11):在Django中怎么下载任意类型的文件?
- 在python中应用Django的模板系统
- python Django的简单应用
- java引用类型的应用
- python中django,tornado框架中各种地址的引用的正确方法
- Python+Django+SAE系列教程10-----Django的模板
- Python django 入门学习系列(一)
- Python django 入门学习系列(二)
- Django中model的字段类型
- Django中URL的相关配置以及后台函数常见设置(Django系列6)
- Python+Django+SAE系列教程2-----Python种的函数、模块和数据结构
- Python+Django+SAE系列教程2-----Python种的函数、模块和数据结构
- JSP页面练习代码(二)
- 数据结构之两个有序表的合并
- JSP页面代码练习(三)
- h5表单新增元素与属性control、placeholder、list、AutoComplete、pattern、SelectionDirection、indeterminate、
- ubuntu16 idea下安装sdk
- Python中引用类型的应用(Django系列2)
- 邻接矩阵、构造有向图
- Xilinx火龙果学习笔记(2)---vivado工程搭建
- 范数概念
- 1012. 数字分类 (20)
- 简单的检测字符串是否是ip的算法
- LiteIDE中漂亮的几款QSS
- 指针的算术运算
- win10 uwp 后台获取资源