Python中引用类型的应用(Django系列2)

原创 2017年09月30日 20:34:03

博客核心内容:

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 = v1
v1.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 = 1234
v2 = v1
v1 = 4567
print(v1)
print(v2)

运行结果:

4567
1234

分析:从内存分配的角度来讲,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']] = row

for 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:
        pass

for 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] = v
print(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+end


def 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+end


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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

python的Django框架应用(2)

python里面的Django项目应用详解

Python+Django+SAE系列教程2-----Python种的函数、模块和数据结构

Python+Django+SAE系列教程2-----Python种的函数、模块和数据结构
  • hemeng
  • hemeng
  • 2014年03月10日 23:50
  • 1909

python 的wxpython包 及django的文档(2)

  • 2011年07月15日 07:29
  • 7.7MB
  • 下载

python django model 字段类型说明(自己收集的仅供参考)

AutoField

Python+Django+SAE系列教程11-----request/pose/get/表单

Python+Django+SAE系列教程11-----request/pose/get/表单
  • hemeng
  • hemeng
  • 2014年05月07日 19:09
  • 2658

[Python] 利用Django进行Web开发系列(一)

阅读目录 1 写在前面 2 什么是Web开发?  3 什么是Django? 4 MVC框架介绍 5 Python Django的安装 6 运行开发服务器 7 参考内容 ...

python django nginx从零开始搭建一个web网站系列1

买了个vps 系统之前是centos7,发现太素了,换成了ubuntu ubuntu自带python3 以及python2  系统没有pip3 如提示,apt-get install ...

Python+Django+SAE系列教程14-----使表单更安全

Python+Django+SAE系列教程14-----使表单更安全
  • hemeng
  • hemeng
  • 2014年05月08日 19:40
  • 1678

Python django 入门学习系列(二)

1 . 绑定 URL 与视图函数2 .使用Django模板系统这里主要是跟着追梦的教程自己一边看着一边用于实践来写的步骤1:首先在 项目应用的目录下创建一个 urls.py 文件 在urls.py...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python中引用类型的应用(Django系列2)
举报原因:
原因补充:

(最多只允许输入30个字)