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 %}

效果展示:
这里写图片描述

原创粉丝点击