• Python学习---抽屉框架分析[小评论分析]0315


    注: 此处的小评论涉及数据库操作

    初级小评论代码

    settings.py

    INSTALLED_APPS = [
       ...
     'app01',   # 注册app
    ]
    STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),)  # 现添加的配置,这里是元组,注意逗号
    TEMPLATES = [
       ...
       'DIRS': [os.path.join(BASE_DIR, 'templates')],
    ]

    urls.py

    from django.contrib import admin
    from django.urls import path
    from django.conf.urls import url, include
    from app01 import views
    urlpatterns = [
        # 评论
      url('comment/', views.Node.Comment)
    ]

    views.py

    from django.shortcuts import render
    from django.shortcuts import redirect
    from django.shortcuts import HttpResponse
    from app01 import models
    
    class Node:
        @staticmethod
        def digui(ret, row):
            for item in ret:
                if row['parent_id'] == item['id']:
                    row['children'] = []
                    item['children'].append(row)
                    break
                else:
                    Node.digui(item['children'], row)
        @staticmethod
        def create_commen_tree(comment_list):
            ret = []
            '''
            ret=[
                    {'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None, 'children':[]},
                    {'id':2, 'content':'JAVA', 'user':'AAA', 'parent_id': None,   'children':[]},
                    {'id':3, 'content':'C++', 'user':'AAA', 'parent_id': None,    'children':[]}
                ]
            '''
            for row in comment_list:
                if not row['parent_id']:
                    row['children'] = []
                    ret.append(row)
                else:
                    Node.digui(ret, row)
            return ret
    
        # 评论
        def Comment(request):
            '''
            【标准】方式一:这里是从数据库内取值
            news_id = 1
            # 获取新闻id=1的新闻,页面不能直接循环,否则显示不出来层级关系
            commen_list = models.Comment.objects.filter(news_id=news_id)
            for row in commen_list:
                print(row.id, row.content, row.userInfo.name, row.parent_id)
    
            return HttpResponse("OK")
            '''
            # 方式二: 这里是模仿来实现评论的级别关系
            comment_list = [
                {'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None},
                {'id':2, 'content':'JAVA', 'user':'AAA', 'parent_id': None},
                {'id':3, 'content':'C++', 'user':'AAA', 'parent_id': None},
                {'id':4, 'content':'PHP', 'user':'BBB', 'parent_id': 1},
                {'id':5, 'content':'HTML', 'user':'CCC', 'parent_id': 1},
                {'id':6, 'content':'CSS', 'user':'DDD', 'parent_id': 4},
                {'id':7, 'content':'JavaScript', 'user':'EEE', 'parent_id': 2},
                {'id':8, 'content':'Python', 'user':'FFF', 'parent_id': 3},
                {'id':9, 'content':'C#', 'user':'GGG', 'parent_id': 2},
                {'id':10, 'content':'Shell', 'user':'HHH', 'parent_id': 4},
                {'id':11, 'content':'C语言', 'user':'XXX', 'parent_id': 6},
            ]
            comment_tree = Node.create_commen_tree(comment_list)
            for item in comment_tree:
                print(item)
            return HttpResponse("OK")

    models.py

    from django.db import models
    
    # Create your models here.
    
    # 新闻表
    class News(models.Model):
        title = models.CharField(max_length=32)
    
    # 用户表
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
    
    # 评论表
    class Comment(models.Model):
        content = models.CharField(max_length=150)
        userInfo = models.ForeignKey("UserInfo", on_delete=True)
        news = models.ForeignKey("News", on_delete=True)
        parent = models.ForeignKey("self", on_delete=True, related_name='o', null=True)
        ctime = models.DateTimeField(auto_now_add=True, null=True)
    

    页面显示;

    image

    image

    初始化数据库

    python manage.py makemigrations
    
    python manage.py migrate
    
    

    高级小评论代码

    原理解析:

    因为li[列表]是引用类型,所以v和li引用同一个地址,v增加后li也同时增加

    li = [
        [1,2,3,4,5],
        [1,2,3,4,5,6],
    ]
    v = li
    v.append([000,111,222])
    print(li)
    print(v)

    image

    同上原理,每个字典更改后,其内部的内容包括引用的内容都会修改

    li = [
        {'id': 10, 'content': 'Shell', 'user': 'HHH', 'parent_id': 4},
        {'id': 11, 'content': 'C语言', 'user': 'XXX', 'parent_id': 6},
    ]
    v = li
    for item in li:
        item.update({'children' : []})   # 每个列表里面添加children属性,有则更改,无责添加
    print('li里的元素:
    ', li)
    
    # 为每隔row添加children属性
    for row in li:
        if row['id'] == 11:
            row['children'].append(row)
    
    li[1]['user'] = 'FTL'  # 此时li[1]里面的内容全部修改了包括内部children中的name
    # 在item里的children元素添加item内容
    for item in li:
        print('children添加元素:
    ', item, item['children'])

    内容显示:

    image

    小评论高级算法:

    comment_list = [
                {'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None},
                {'id':2, 'content':'JAVA', 'user':'AAA', 'parent_id': None},
                {'id':3, 'content':'C++', 'user':'AAA', 'parent_id': None},
                {'id':4, 'content':'PHP', 'user':'BBB', 'parent_id': 1},
                {'id':5, 'content':'HTML', 'user':'CCC', 'parent_id': 1},
                {'id':6, 'content':'CSS', 'user':'DDD', 'parent_id': 4},
                {'id':7, 'content':'JavaScript', 'user':'EEE', 'parent_id': 2},
                {'id':8, 'content':'Python', 'user':'FFF', 'parent_id': 3},
                {'id':9, 'content':'C#', 'user':'GGG', 'parent_id': 2},
                {'id':10, 'content':'Shell', 'user':'HHH', 'parent_id': 4},
                {'id':11, 'content':'C语言', 'user':'XXX', 'parent_id': 6},
            ]
    '''
    方法一: for循环,效率低
    ret = []
    for it in comment_list:
        it.update({'children': []})
    for item in comment_list:
        current_row = item
        current_row_parentId = current_row['parent_id']
        if not current_row_parentId:
            ret.append(current_row)
        else:
            for row in comment_list:   # 效率低,从头到尾又循环了一遍
                if row['id'] == current_row_parentId:
                    row['children'].append(item)
    print(ret)
    '''
    # 方法二: 利用字典的get效率更高,因为字典的key会转换为哈希字符串,get相当于根据sql里面的索引查找
    ret = []
    comment_list_dict={}
    for item in comment_list:
        item.update({"children":[]})
     #有则更改,无责添加: comment_list_dict={1:{'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None},}
        comment_list_dict[item['id']]=item
    for row in comment_list:
        current_now_parentID = row['parent_id']
        parent_row = comment_list_dict.get(current_now_parentID)  # 找到了父级row
        if not parent_row:
            ret.append(row)
        else:
            parent_row['children'].append(row)            # 直接给父级row的children添加当前元素
    print(ret)

    image

    小评论高级完整版[前台处理数据,推荐使用]

    settings.py

    INSTALLED_APPS = [
       ...
     'app01',   # 注册app
    ]
    STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),)  # 现添加的配置,这里是元组,注意逗号
    TEMPLATES = [
       ...
       'DIRS': [os.path.join(BASE_DIR, 'templates')],
    ]

    urls.py

    from django.contrib import admin
    from django.urls import path
    from django.conf.urls import url, include
    from app01 import views
    urlpatterns = [
       # 评论
     url('comment/', views.comment),
     url('index/', views.index),
    ]

    views.py

    from django.shortcuts import render, redirect, HttpResponse
    from app01 import models
    
    #小评论高级算法
    def comment(request):
        '''
            数据库的操作:
            nid = request.GET.get('nid')
            comment_list=models.obects.filter(nid=nid).values('id',...)  # 利用value进行字段内容的获取
            commont_list --> ret  [进行树形结构的转换,这里直接用固定的内容演示]
        '''
        comment_list = [
                    {'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None},
                    {'id':2, 'content':'JAVA', 'user':'AAA', 'parent_id': None},
                    {'id':3, 'content':'C++', 'user':'AAA', 'parent_id': None},
                    {'id':4, 'content':'PHP', 'user':'BBB', 'parent_id': 1},
                    {'id':5, 'content':'HTML', 'user':'CCC', 'parent_id': 1},
                    {'id':6, 'content':'CSS', 'user':'DDD', 'parent_id': 4},
                    {'id':7, 'content':'JavaScript', 'user':'EEE', 'parent_id': 2},
                    {'id':8, 'content':'Python', 'user':'FFF', 'parent_id': 3},
                    {'id':9, 'content':'C#', 'user':'GGG', 'parent_id': 2},
                    {'id':10, 'content':'Shell', 'user':'HHH', 'parent_id': 4},
                    {'id':11, 'content':'C语言', 'user':'XXX', 'parent_id': 6},
                ]
        ret = []
        comment_list_dict={}
        for item in comment_list:
            item.update({"children":[]})
            #  有则更改,无责添加: comment_list_dict={1:{'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None},}
            comment_list_dict[item['id']]=item
    
        for row in comment_list:
            current_now_parentID = row['parent_id']
            parent_row = comment_list_dict.get(current_now_parentID)  # 找到了父级row
            if not parent_row:
                ret.append(row)
            else:
                parent_row['children'].append(row)       # 直接给父级row的children添加当前元素
        print(ret)
        import json
        return HttpResponse(json.dumps(comment_list))
    
    def index(request):
        return render(request, 'index.html')

    models.py[未用到,静态数据源]

    from django.db import models
    # Create your models here.
    # 新闻表
    class News(models.Model):
        title = models.CharField(max_length=32)
    # 用户表
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
    # 评论表
    class Comment(models.Model):
        content = models.CharField(max_length=150)
        userInfo = models.ForeignKey("UserInfo", on_delete=True)
        news = models.ForeignKey("News", on_delete=True)
        parent = models.ForeignKey("self", on_delete=True, related_name='o', null=True)
        ctime = models.DateTimeField(auto_now_add=True, null=True)

    templates/comment.html

    <!DOCTYPE html>
    <html lang="en">
    <head>    <meta charset="UTF-8">  </head>
    <body> </body>
    </html>

    templates/index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>  <meta charset="UTF-8">
        <style>
            .comment-box {
                margin-left: 10px;
            }
        </style>
    </head>
    <body>
        <div class="item">
            <h2>[静态演示效果]</h2>
            <a nid="17" class="com">评论</a>
            {#comment-box表示一个评论#}
            <div class="comment-list">
                <div class="comment-box">
                <span>Python开发</span>
                <div class="comment-box">
                    <span>Java开发</span>
                    <div class="comment-box">
                    <span>C开发</span>
                </div>
                </div>
                 <div class="comment-box">
                    <span>PHP开发</span>
                </div>
            </div>
                <div class="comment-box">
                <span>手机厂商</span>
                <div class="comment-box">
                    <span>Huawei</span>
                    <div class="comment-box">
                    <span>XiaoMi</span>
                </div>
                </div>
                 <div class="comment-box">
                    <span>Apple</span>
                </div>
            </div>
            </div>
        </div><hr>
        <div class="item">
            <h3>动态演示效果,点击显示评论</h3>
            <a nid="18"  class="com">评论</a>
        </div><hr>
    </body>
    <script src="/static/jquery-2.1.4.min.js"></script>
    <script>
        // 页面加载完成后实现绑定小姑
        $(function () {
            bindCommentEvent();
        });
    
        function bindCommentEvent() {
            $(".com").click(function () {
                var news_id = $(this).attr('nid');
                console.log(news_id);
                var $this = $(this);
                $.ajax({
                    url:'/comment/',
                    type:'GET',
                    // 一个date引发的错误
                    data: {nid:news_id},
                    dataType: "JSON",
                    success: function (args) {
                        console.log(args);
                        create_tree(args, $this);
                    }
                })
            })
        }
        // 递归
        function digui(child_data) {
            var html = "";
            $.each(child_data, function (k1, v1) {
                var b = '<div class="comment-box"><span>';
                b += v1.content;
                b += '</span>';
                son = digui(v1.children);
                b += son;
                b += '</div>';
                html += b;
            });
            console.log("HTML:",html)
            return html;
        }
        function create_tree(data,$this) {
            var html = '<div class="comment-list">';
            {#  注意这里是在函数内获取到key,value,然后从value里面获取内容#}
            $.each(data, function (k, v) {
                var a = '<div class="comment-box"><span>';
                a += v.content + "</span>";
                // 添加子评论
                var child = digui(v.children);
                console.log(child);
                a += child;
                a +='</div>';
                html += a;
            });
            html += '</div>';
            console.log($this);
            $this.append(html);
        }
    </script>
    </html>

    页面显示;

    image

    image

    初始化数据库

    python manage.py makemigrations
    python manage.py migrate
    

    小评论最终版[后台进行tempaltetags来处理递归数据,不推荐]

    settings.py

    INSTALLED_APPS = [
       ...
     'app01',   # 注册app
    ]
    STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),)  # 现添加的配置,这里是元组,注意逗号
    TEMPLATES = [
       ...
       'DIRS': [os.path.join(BASE_DIR, 'templates')],
    ]

    urls.py

    from django.contrib import admin
    from django.urls import path
    from django.conf.urls import url, include
    from app01 import views
    urlpatterns = [
       # 评论
     url('comment/', views.comment),
     url('index/', views.index),
    ]

    views.py

    from django.shortcuts import render, redirect, HttpResponse
    from app01 import models
    
    #小评论高级算法
    def comment(request):
        '''
            数据库的操作:
            nid = request.GET.get('nid')
            comment_list=models.obects.filter(nid=nid).values('id',...)  # 利用value进行字段内容的获取
            commont_list --> ret  [进行树形结构的转换,这里直接用固定的内容演示]
        '''
        comment_list = [
                    {'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None},
                    {'id':2, 'content':'JAVA', 'user':'AAA', 'parent_id': None},
                    {'id':3, 'content':'C++', 'user':'AAA', 'parent_id': None},
                    {'id':4, 'content':'PHP', 'user':'BBB', 'parent_id': 1},
                    {'id':5, 'content':'HTML', 'user':'CCC', 'parent_id': 1},
                    {'id':6, 'content':'CSS', 'user':'DDD', 'parent_id': 4},
                    {'id':7, 'content':'JavaScript', 'user':'EEE', 'parent_id': 2},
                    {'id':8, 'content':'Python', 'user':'FFF', 'parent_id': 3},
                    {'id':9, 'content':'C#', 'user':'GGG', 'parent_id': 2},
                    {'id':10, 'content':'Shell', 'user':'HHH', 'parent_id': 4},
                    {'id':11, 'content':'C语言', 'user':'XXX', 'parent_id': 6},
                ]
        ret = []
        comment_list_dict={}
        for item in comment_list:
            item.update({"children":[]})
            #  有则更改,无责添加: comment_list_dict={1:{'id':1, 'content':'Python', 'user':'AAA', 'parent_id': None},}
            comment_list_dict[item['id']]=item
    
        for row in comment_list:
            current_now_parentID = row['parent_id']
            parent_row = comment_list_dict.get(current_now_parentID)  # 找到了父级row
            if not parent_row:
                ret.append(row)
            else:
                parent_row['children'].append(row)       # 直接给父级row的children添加当前元素
        print(ret)
              return render(request,'comment.html', {"ret":ret})
    
    def index(request):
        return render(request, 'index.html')

    models.py[未用到,静态数据源]

    from django.db import models
    # Create your models here.
    # 新闻表
    class News(models.Model):
        title = models.CharField(max_length=32)
    # 用户表
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
    # 评论表
    class Comment(models.Model):
        content = models.CharField(max_length=150)
        userInfo = models.ForeignKey("UserInfo", on_delete=True)
        news = models.ForeignKey("News", on_delete=True)
        parent = models.ForeignKey("self", on_delete=True, related_name='o', null=True)
        ctime = models.DateTimeField(auto_now_add=True, null=True)

    App01/tempalatetags/hhh.py

    from django import template
    from django.utils.safestring import mark_safe
    register = template.Library()
    
    def diGui(children_list):
        html = ""
        for cv in children_list:
            b = '<div class="comment-box"><span>'
            b += cv['content'] + "</span>"
            b += diGui(cv['children'])
            b += "</div>"
            html += b
        return html
    
    @register.simple_tag
    def create_tree(comment_list):
        html = '<div class="comment-list">'
        for v in comment_list:
            a = '<div class="comment-box"><span>'
            a += v['content'] + "</span>"
            a += diGui(v['children'])
            a += "</div>"
            html += a
        return mark_safe(html) # 不添加界面只显示源代码,并不进行html渲染

    templates/comment.html

    {% load hhh %}
    {% create_tree ret %}

    templates/index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>  <meta charset="UTF-8">
        <style>
            .comment-box {
                margin-left: 10px;
            }
        </style>
    </head>
    <body>
        <div class="item">
            <h2>[静态演示效果]</h2>
            <a nid="17" class="com">评论</a>
            {#comment-box表示一个评论#}
            <div class="comment-list">
                <div class="comment-box">
                <span>Python开发</span>
                <div class="comment-box">
                    <span>Java开发</span>
                    <div class="comment-box">
                    <span>C开发</span>
                </div>
                </div>
                 <div class="comment-box">
                    <span>PHP开发</span>
                </div>
            </div>
                <div class="comment-box">
                <span>手机厂商</span>
                <div class="comment-box">
                    <span>Huawei</span>
                    <div class="comment-box">
                    <span>XiaoMi</span>
                </div>
                </div>
                 <div class="comment-box">
                    <span>Apple</span>
                </div>
            </div>
            </div>
        </div><hr>
        <div class="item">
            <h3>动态演示效果,点击显示评论</h3>
            <a nid="18"  class="com">评论</a>
        </div><hr>
    </body>
    <script src="/static/jquery-2.1.4.min.js"></script>
    <script>
        // 页面加载完成后实现绑定小姑
        $(function () {
            bindCommentEvent();
        });
    
        function bindCommentEvent() {
            $(".com").click(function () {
                var news_id = $(this).attr('nid');
                console.log(news_id);
                var $this = $(this);
                $.ajax({
                    url:'/comment/',
                    type:'GET',
                    // 一个date引发的错误
                    data: {nid:news_id},
                    dataType: "html",
                    success: function (args) {
                        console.log('HHH');
                        console.log(args);
                        {# create_tree(args, $this);#}
                        $this.after(args);
                    }
                })
            })
        }
        /**
        function digui(child_data) {
            var html = "";
            $.each(child_data, function (k1, v1) {
                var b = '<div class="comment-box"><span>';
                b += v1.content;
                b += '</span>';
                son = digui(v1.children);
                b += son;
                b += '</div>';
                html += b;
            });
            console.log("HTML:",html)
            return html;
        }
    
        function create_tree(data,$this) {
            var html = '<div class="comment-list">';
            {#  注意这里是在函数内获取到key,value,然后从value里面获取内容#}
            $.each(data, function (k, v) {
                var a = '<div class="comment-box"><span>';
                a += v.content + "</span>";
                // 添加子评论
                var child = digui(v.children);
                console.log(child);
                a += child;
                a +='</div>';
                html += a;
            });
            html += '</div>';
            console.log($this);
            $this.after(html);
        }
        **/
    </script>
    </html>

    页面显示;

    image

    初始化数据库

    python manage.py makemigrations
    python manage.py migrate
    
  • 相关阅读:
    js伪数组转数组内部实现
    Vuex核心部分学习参考地址
    vue中让异步代码变成同步的写法
    node.js中文件操作路径和模板标识路径问题
    如果不想安装cnpm又想使用淘宝的服务器来下载,怎么做?
    npm常用命令
    node中模块加载机制
    通过nodejs,简单模拟客户端和服务端进行通信
    vue中非父子组件的传值
    图论1-2
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9417356.html
Copyright © 2020-2023  润新知