关闭

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

标签: python引用类型
185人阅读 评论(0) 收藏 举报
分类:

博客核心内容:

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

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

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Django中,模型(models),视图(views)和模板的区别和应用

模型 任何应用程序的基本,不管是不是Web应用,都是它所展现、收集和修改的信息。因此,若将应用程序分层,模型(model)将是最底部的一层,它是基础。视图和模板可以根据数据进出模型的方式以及表现...
  • codeksy
  • codeksy
  • 2016-04-13 10:36
  • 1284

Django model 字段类型及选项解析

model field 类型 1、AutoField      一个自增的IntegerField,一般不直接使用,Django会自动给每张表添加一个自增的primary key。 ...
  • iloveyin
  • iloveyin
  • 2015-04-03 10:57
  • 15008

Python Django进阶教程(三)(模型的高级用法)

Django版本:1.11 操作系统:Windows Python:3.5数据模型高级使用。这节主要讲模型的使用。回顾一下基础教程的模型设计 新建了三个表,分别Publisher,A...
  • HuangZhang_123
  • HuangZhang_123
  • 2017-05-11 12:03
  • 1134

python的Django框架应用(2)

python里面的Django项目应用详解
  • qq_38776653
  • qq_38776653
  • 2017-07-13 10:35
  • 174

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

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

beginning django (使用Python进行Web应用程序开发和部署) 英文原版

  • 2017-11-05 11:53
  • 10.61MB
  • 下载

SAE Django框架python应用部署----独享服务器

  • 2017-12-08 18:18
  • 51B
  • 下载

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

  • 2011-07-15 07:29
  • 7.70MB
  • 下载

python网络爬虫系列教程——python中urllib、urllib2、cookie模块应用全解

全栈工程师开发手册 (作者:栾鹏) python教程全解 python数据挖掘库urllib、urllib2知识全解。以下的所有程序需要导入以下库,和定义变量urlstr#coding:u...
  • luanpeng825485697
  • luanpeng825485697
  • 2017-10-29 11:23
  • 1442

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

AutoField
  • lianghx001
  • lianghx001
  • 2014-04-23 10:59
  • 1258
    个人资料
    • 访问:611421次
    • 积分:8925
    • 等级:
    • 排名:第2458名
    • 原创:332篇
    • 转载:87篇
    • 译文:0篇
    • 评论:107条
    最新评论