zoukankan      html  css  js  c++  java
  • BBS论坛 文章详情、点赞、评论

    六、文章详情、点赞、评论

     文章详情页面:

    def article_detail(request, username, article_id):
        # user_obj  = models.UserInfo.objects.filter(username=username)
        article_obj = models.Article.objects.filter(pk=article_id).first()
        blog = models.Blog.objects.filter(userinfo__username=username).first()
        comment_list = models.Comment.objects.filter(article_id=article_id)
        return render(request, 'article_detail.html', locals())
    views.py 文章详情页
    {% extends 'base.html' %}
    
    {% block css %}
        <style>
            #div_digg {
                float: right;
                margin-bottom: 10px;
                margin-right: 30px;
                font-size: 12px;
                width: 125px;
                text-align: center;
                margin-top: 10px;
            }
    
            .diggit {
                float: left;
                width: 46px;
                height: 52px;
                background: url('/static/img/upup.gif') no-repeat;
                text-align: center;
                cursor: pointer;
                margin-top: 2px;
                padding-top: 5px;
            }
    
            #div_digg .diggnum {
                line-height: 1.5em !important;
            }
    
            .diggnum {
                font-size: 14px;
                color: #075db3;
                font-family: Verdana;
            }
    
            .buryit {
                float: right;
                margin-left: 20px;
                width: 46px;
                height: 52px;
                background: url("/static/img/downdown.gif") no-repeat;
                text-align: center;
                cursor: pointer;
                margin-top: 2px;
                padding-top: 5px;
            }
    
            .clear {
                clear: both;
            }
    
            .diggword {
                margin-top: 5px;
                margin-left: 0;
                font-size: 12px;
                color: gray;
            }
        </style>
    {% endblock %}
    {% block content %}
        {#    <h3>{{ article_obj.title }}</h3>#}
        {{ article_obj.content|safe }}
        <div class="clearfix">
    
            <div id="div_digg">
                <div class="diggit action">
                    <span class="diggnum" id="digg_count">{{ article_obj.up_num }}</span>
                </div>
                <div class="buryit action">
                    <span class="burynum" id="bury_count">{{ article_obj.down_num }}</span>
                </div>
                <div class="clear"></div>
                <div class="diggword" id="digg_tips" style="color: red;"></div>
            </div>
        </div>
        <hr>
        {# --------------------评论内容部分 开始 ------------------- #}
        <p>评论列表:</p>
        <div class="form-group list-group">
            {% for comment in comment_list %}
    
                <div class="form-group"><span style="color: cornflowerblue">#{{ forloop.counter }}楼&nbsp;</span>
                    {{ comment.create_time|date:'Y-m-d' }}&nbsp;
                    <a href="/{{ comment.user.username }}/">{{ comment.user.username }}</a>
                    <span class="pull-right reply" comment_id="{{ comment.pk }}" username={{ comment.user.username }}><a>回复</a></span>
                    <div>
                        {% if comment.parent %}
                            <p>@&nbsp;{{ comment.parent.user.username }}</p>
                        {% endif %}
                        <p style="color: darkgray">&nbsp;&nbsp;{{ comment.content }}</p>
                        <hr>
                    </div>
                </div>
            {% endfor %}
    
        </div>
        {# --------------------评论内容部分 结束 ------------------- #}
        {% if request.user.is_authenticated %}
         {# -----------------------------评论部分 开始 ---------------------- #}
            <div>
                <p><span class="glyphicon glyphicon-comment"></span>发表评论</p>
                <p>
                    <span>昵称:<span class="glyphicon glyphicon-user"></span></span>
                    <input type="text" value="{{ request.user.username }}" disabled>
                </p>
                <p>评论内容:</p>
                <textarea name="" cols="80" rows="10" id="id_comment"></textarea>
                <p>
                    <button class="btn btn-primary" id="id_submit">提交评论</button>
                </p>
                <br><br><br>
            </div>
        {# ------------------------------评论部分 结束 ---------------------- #}
        {% endif %}
    {% endblock %}
    
    {% block js %}
        <script>
            console.log("this is script!");
            // 点赞点踩
            $('.action').click(function () {
                {#alert($(this).hasClass('diggit'))  利用类操作判断是否有某一个类属性从而区分是点赞还是点踩#}
                let isUp = $(this).hasClass('diggit');
                let $info = $('#digg_tips');
                let $span = $(this).children();
                $.ajax({
                    url: "/up_or_down/",
                    type: 'post',
                    data: {
                        'article_id':{{ article_obj.pk }},
                        'is_up': isUp,
                        'csrfmiddlewaretoken': '{{ csrf_token }}'
                    },
                    success: function (data) {
                        if (data.code == 200) {
                            $info.html(data.msg);
                            // 将span标签内部的文本数字加1
                            $span.text(Number($span.text()) + 1)
                        } else {
                            $info.html(data.msg)
                        }
                    }
                })
            });
    
            let parentId = '';
            // 提交评论
            $('#id_submit').click(function () {
                console.log("this is 提交数据!");
                let sub_content = $('#id_comment').val();
                if (sub_content == ''){
                    alert("评论不能为空!")
                }else{
                    console.log('this is sub_content:', sub_content);
                    if (parentId){
                        let indexVal = sub_content.indexOf('
    ') +1;
                        sub_content = sub_content.slice(indexVal);
                        console.log(sub_content)
                    }
                    // 分析: 将评论提交到后端,需要传 文章id、评论内容,评论人的id
                    $.ajax({
                        url: '/comment/',
                        type: 'post',
                        data: {
                            'article_id': '{{ article_id }}',
                            'content': sub_content,
                            'csrfmiddlewaretoken': '{{ csrf_token }}',
                            'parentId': parentId,
    
                        },
                        success: function (data) {
                            if (data.code == 100) {
                                let userName = '{{ request.user.username }}';
                                let content = sub_content;
                                let tempStr = `
                                <div>
                                    <p class="form-group"><span style="color: cornflowerblue">
                                        <a href="/${userName}/">${userName}</a>
                                    </p>
                                    <p style="color: darkgray">&nbsp;&nbsp;${content}</p>
                                    <hr>
                                  </div>
                            `;
                                $(".list-group").append(tempStr);
                                // 将textarea框中的内容清空
                                $('#id_comment').val('');
                                // 将全局的parentId清空
                                parentId = ''
                            }
                        }
                    })
    
                }
            });
    
            // 回复按钮逻辑代码
            $('.reply').click(function () {
                // 1.把你想评论的那条评论所属者的名字添加到textarea中(@+用户名) 如何获取评论人名
                let pUserName = $(this).attr('username');
                let pCommentId = $(this).attr('comment_id');
                // 2.自动换行
                $('#id_comment').val('@'+pUserName+'
    ');
                // 3.textarea自动聚焦
                $('#id_comment').focus();
                // 4.将全局的parentId赋值
                parentId = pCommentId;
            });
        </script>
    {% endblock %}
    article_detail.html
    def up_or_down(request):
        back_dic = {'code': 100, 'msg': ''}
        if request.is_ajax():
            is_up = request.POST.get('is_up')
            is_up = json.loads(is_up)  # 利用json模块反序列称后端python布尔值类型
            article_id = request.POST.get('article_id')
    
            # 1.判断用户是否登录
            if request.user.is_authenticated():
                # 2.判断文章是否是当前用户写的
                article_obj = models.Article.objects.filter(pk=article_id).first()
                if not article_obj.blog.userinfo.pk == request.user.id:
                    # 3.判断当前用户是否对该文章点赞或点踩了
                    res = models.UpAndDown.objects.filter(user=request.user, article=article_obj)
                    if not res:
                        # 4.需要在两张表里面修改数据
                        # 先修改普通字段的数据
                        if is_up:
                            # 点赞
                            models.Article.objects.filter(pk=article_id).update(up_num=F('up_num') + 1)
                            back_dic['msg'] = '点赞成功'
                        else:
                            # 点踩
                            models.Article.objects.filter(pk=article_id).update(down_num=F('down_num') + 1)
                            back_dic['msg'] = '点踩成功'
                        # 最后修改UpAndDown表数据
                        models.UpAndDown.objects.create(user=request.user, article=article_obj, is_up=is_up)
                        back_dic['code'] = 200
                    else:
                        back_dic['code'] = 201
                        back_dic['msg'] = '你已经点过了'
                else:
                    back_dic['code'] = 202
                    back_dic['msg'] = '你个臭不要脸的不能点自己的'
            else:
                back_dic['code'] = 203
                back_dic['msg'] = mark_safe('请先<a href="/login/">登录</a>')
            return JsonResponse(back_dic)
    views.py 点赞点踩
    def comment(request):
        back_dic = {'code': 100, 'msg': ''}
        if request.is_ajax():
            # 获取前端发过来的数据
            # print("this is comment!")
            article_id = request.POST.get('article_id')
            # print(article_id)
            content = request.POST.get('content')
            # print(content)
            parent_id = request.POST.get('parentId')
            # print(parent_id)
            if request.user.is_authenticated():
                # print("已经登录,正要去写评论入库")
                with transaction.atomic():
                    # 在文章表中普通的评论字段加1
                    models.Article.objects.filter(pk=article_id).update(comment_num=F('comment_num') + 1)
                    # 再在评论表中将评论的信息存储
                    models.Comment.objects.create(user=request.user, article_id=article_id, content=content,
                                                  parent_id=parent_id)
                back_dic['msg'] = '评论成功!'
            else:
                back_dic['code'] = 101
                back_dic['msg'] = '请想登录!'
        return JsonResponse(back_dic)
    views.py 评论
  • 相关阅读:
    Spring用代码来读取properties文件
    单链表与双链表的区别
    为什么有些IP无法PING通但又能访问
    使用iperf3调试网络
    arm linux 移植 iperf3
    ZYNQ:PetaLinux工程更新HDF文件的脚本
    ZYNQ:使用PetaLinux打包 BOOT.BIN、image.ub
    ZYNQ:提取PetaLinux中Linux和UBoot配置、源码
    ZYNQ:使用 PetaLinux 构建Linux项目
    ZYNQ:使用SDK打包BOOT.BIN、烧录BOOT.BIN到QSPI-FLASH
  • 原文地址:https://www.cnblogs.com/xt12321/p/11104506.html
Copyright © 2011-2022 走看看