zoukankan      html  css  js  c++  java
  • Python之路,day22-BBS基础

    Python之路,day22-BBS基础

    多级评论

    from  django.template import Library
    from django.utils.safestring import mark_safe
    
    register = Library()
    
    @register.simple_tag
    def truncate_upload_img(img_src):
        print(dir(img_src))
        print(img_src.name)
        return img_src.name.lstrip("/uploads/")
    
    
    @register.simple_tag
    def render_paginator_btn(articles,page):
    
        current_page = articles.number
        if abs(current_page - page) <= 5 :
            ele = """<li ><a href="?page={page}">{page}</a></li>""".format(page=page)
            return mark_safe(ele)
    
        return ''
    
    
    def build_comment_tree(comment_dic,obj):
        """递归的去把每个评论放到合适的层级里面"""
    
        for k,v in comment_dic.items():
            if obj.p_node ==  k: #代表找他了它父节点,把自己加到k下面
                print("[%s]找到了父节点[%s]" %(obj,k))
                comment_dic[k][obj] = {}
            else: #开始进行深度查询
                print("没找到,进入下一层查找",obj)
                build_comment_tree(comment_dic[k], obj)
    
    def build_comment_html(comment_dic,margin_arg):
        """循环评论的字典, 拼接html"""
    
        comment_eles = ''
        for k,v in comment_dic.items():
            comment_eles += '''<div style='border:1px dashed black;padding:10px;margin-left:{margin}px'>{user} ---- {date} --- {comment}</div>'''
                .format(user=k.user,
                        date=k.date.strftime('%Y-%m-%d %H:%M:%S'),
                        comment=k.comment,
                        margin=margin_arg)
            if v:
    
                comment_eles += build_comment_html(comment_dic[k],margin_arg+20)
    
        return comment_eles
    
    @register.simple_tag
    def load_comments(article_obj):
    
        #1.先把数据库里所有的这篇文章的评论查出来,转成字典
        #2.递归的循环这个字典,生成html评论元素
    
        comment_dic = {
        }
    
        comment_objs = article_obj.comment_set.all().order_by('date') #列表
    
        for obj in comment_objs:
    
            if not obj.p_node:#判断obj有没有p_node,没有的话,那它自己就是顶级评论
                comment_dic[obj] = {}
            else: #有父亲节点
                build_comment_tree(comment_dic,obj)
        print(comment_dic)
    
        comment_list = sorted(comment_dic.items(),key=lambda x:x[0].date)
        print("comment objs:",comment_list)
    
        comment_html = """"""
    
        for comment_branch in comment_list:
            margin_arg=0
            branch_ele = """<div style='border:1px dashed black;padding:10px;margin-left:{margin}px'>{user} ---- {date} --- {comment}</div>""".
                format(user=comment_branch[0].user,
                       date=comment_branch[0].date.strftime('%Y-%m-%d %H:%M:%S'),
                       comment=comment_branch[0].comment,
                       margin=margin_arg)
            comment_html += branch_ele
    
            #开始构建它的子级评论的元素
            comment_html +=  build_comment_html(comment_branch[1],margin_arg+20)
    
        return mark_safe(comment_html)
    

      

    webqq

    from django.shortcuts import render,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    from webqq.msg_handler import MsgHandler
    import queue,json
    # Create your views here.
    
    MSG_QUEUES = {}
    
    
    
    def dashboard(request):
    
        print("user--",request.user.userproifle)
        return render(request,"webqq/dashboard.html")
    
    #@csrf_exempt
    def msg_api(request):
    
    
        msg_obj = MsgHandler(request, MSG_QUEUES)
        if request.method == "POST":
    
            msg_obj.msg_send()
            return HttpResponse(json.dumps({"msg_send_status": 1}))
        else:
            msg_data = msg_obj.msg_recv()
            return HttpResponse(json.dumps(msg_data))
    

      

      1 {% extends 'index.html' %}
      2 
      3 {% block extra-head-resources %}
      4     <link href="/static/css/webqq_style.css" rel="stylesheet">
      5 
      6 {% endblock %}
      7 
      8 
      9 {% block container %}
     10 <div  class="row" style="margin-top: 50px;height: 100%;">
     11 {% csrf_token %}
     12     <div class="col-lg-2 contact_list">
     13 
     14         <ul class="nav nav-tabs" role="tablist">
     15           <li role="presentation"><a href="#contacts" aria-controls="contacts" role="tab" data-toggle="tab">c</a></li>
     16           <li role="presentation"><a href="#groups" aria-controls="groups" role="tab" data-toggle="tab">g</a></li>
     17 
     18         </ul>
     19 
     20 
     21          <div class="tab-content">
     22             <div role="tabpanel" class="tab-pane active" id="contacts">
     23 
     24                 <div class="list-group">
     25                     {% for contact in request.user.userproifle.friends.all %}
     26 
     27                         <a href="#" class="list-group-item" contact_id="{{ contact.id }}" contact_name="{{ contact.name }}" onclick="OpenSession(this)">{{ contact }}
     28 {#                            <span class="badge">14</span>#}
     29                         </a>
     30 
     31                     {% endfor %}
     32 
     33                 </div>
     34 
     35             </div>
     36             <div role="tabpanel" class="tab-pane" id="groups">groups</div>
     37           </div>
     38 
     39 
     40 
     41     </div>
     42     <div class="col-lg-8  chat_panel">
     43 
     44         <div class="row chat_panel_header">
     45 
     46             <div class="hidden" style="color: green">
     47                 正在与<span contact_id="" id="chat_panel_header_text"></span>聊天
     48             </div>
     49         </div>
     50 
     51         <div class="row chat_panel_body">
     52             body
     53         </div>
     54 
     55         <div class="row chat_panel_input_box">
     56 
     57             <textarea id="msg_input_box" class="msg_input_box">
     58 
     59 
     60 
     61             </textarea>
     62 
     63         </div>
     64 
     65     </div>
     66 
     67 
     68 </div>
     69 
     70 
     71 {% endblock %}
     72 
     73 
     74 {% block bottom-js %}
     75 
     76 <script>
     77 
     78     $(document).ready(function () {
     79 
     80          csrfmiddlewaretoken  = $("input[name='csrfmiddlewaretoken']").val();
     81 
     82 
     83          $("body").delegate("textarea", "keydown",function(e){
     84                 if(e.which == 13) {//Enter key down
     85                     //send msg button clicked
     86                     var msg_text = $("textarea").val();
     87                     if ($.trim(msg_text).length > 0){
     88                         //console.log(msg_text);
     89                         SendMsg(msg_text);
     90                     }
     91                     //no wait the send_msg's call confirm msg
     92                     AddSentMsgIntoBox(msg_text);
     93                     $("textarea").val('');
     94                 }
     95          });//end body
     96 
     97 
     98 
     99 
    100          /*setInterval(function () {
    101              LoadNewMsgs();
    102          },1000)*/
    103 
    104           LoadNewMsgs();
    105 
    106 
    107 
    108 
    109     });//end doc ready
    110 
    111 
    112     function LoadNewMsgs() {
    113 
    114 
    115 
    116         $.get("{% url 'get_msg' %}",function(callback){
    117             console.log("get_msg callback:",callback);
    118             return LoadNewMsgs();
    119         });//end get
    120     }
    121 
    122     function SendMsg(msg) {
    123         console.log("going tosend msg" + msg);
    124 
    125 
    126 
    127         var msg_data = {
    128             'csrfmiddlewaretoken':csrfmiddlewaretoken,
    129             'from':"{{ request.user.userproifle.id }}",
    130             'to': $("#chat_panel_header_text").attr("contact_id"),
    131             'data':msg
    132         }
    133         $.post("{% url 'msg_api' %}", msg_data ,function(callback){
    134 
    135             var callback = JSON.parse(callback); //json反序列化
    136             console.log("msg_send_status:",callback.msg_send_status);
    137             if ( callback.msg_send_status != 1){
    138                 alert("消息发送失败:"+ msg);
    139             }
    140         });//end post
    141 
    142 
    143     }
    144     function AddSentMsgIntoBox(msg_text) {
    145         var d = new Date();
    146         var msg_ele = "<div>   <div>{{ request.user.userproifle.name }}  "+ d.getHours() + ":" +d.getMinutes() + ":" + d.getSeconds() + "</div>";
    147         msg_ele += "<div>" + msg_text +"</div> </div>";
    148         $(".chat_panel_body").append(msg_ele);
    149 
    150 
    151         $('.chat_panel_body').animate({
    152             scrollTop: $('.chat_panel_body')[0].scrollHeight}, 500)
    153 
    154     }
    155     function  OpenSession(ele) {
    156         var contact_id = $(ele).attr("contact_id");
    157         var contact_name = $(ele).attr("contact_name");
    158         $(ele).addClass("active");
    159         $(ele).siblings().removeClass("active");
    160         $("#chat_panel_header_text").text(contact_name);
    161         $("#chat_panel_header_text").parent().removeClass("hidden");
    162         $("#chat_panel_header_text").attr("contact_id",contact_id);
    163 
    164     }
    165 
    166 
    167 
    168 
    169 
    170 
    171 </script>
    172 
    173 
    174 {% endblock %}
  • 相关阅读:
    autocare使用命令
    使用国内豆瓣源
    HCNA(二)以太网的帧结构
    HCNA(一)网络传输介质
    Python
    Python
    Python
    Delphi
    HCNP
    Python
  • 原文地址:https://www.cnblogs.com/heshaochuan/p/6681201.html
Copyright © 2011-2022 走看看