zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
    zoj 3471 Most Powerful (有向图)最大生成树 状压dp
    poj 2280 Islands and Bridges 哈密尔顿路 状压dp
    hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
    poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
    poj 1185 炮兵阵地 状压dp
    poj 3254 Corn Fields 状压dp入门
    loj 6278 6279 数列分块入门 2 3
    VIM记事——大小写转换
    DKIM支持样本上传做检测的网站
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9417356.html
Copyright © 2011-2022 走看看