• BBS_02day


    BBS_02day:

    展示个人所有文章:

    def article_detail(request,username,article_id):
        # 将文章查询出来
        article_obj = models.Article.objects.filter(pk=article_id).first()
        blog = article_obj.blog
        # 还应该获取当前文章所有的评论信息
        comment_list = models.Comment.objects.filter(article=article_obj)
        if not article_obj: #没有则404
            return render(request,'error.html')
        return render(request,'article_detail.html',locals())
    
    
    

    点赞,点彩功能:

    import json
    from django.db.models import F
    from django.utils.safestring import mark_safe
    def updown(request):
        if request.is_ajax():
            if request.method == 'POST':
                back_dic = {'code':1000,'msg':''}
                is_up = request.POST.get('is_up')  # 是一个字符串格式的json数据
                article_id = request.POST.get('article_id')
                is_up = json.loads(is_up)  # 将json格式的字符串数据转成python对应的数据类型
                # print(is_up,type(is_up))
                """
                点赞点踩业务逻辑
                    1.判断当前用户是否登录
                    2.当前这篇文章是否是当前用户自己写的
                    3.当前这篇文章用户是否已经点过
                    4.操作数据库 完成数据修改
                        1.点赞点踩添加数据的时候
                        2.文章表里面对应的普通字段也得修改
                """
                # 1.判断当前用户是否登录
                if request.user.is_authenticated():
                    # 2.当前这篇文章是否是当前用户自己写的
                    article_obj = models.Article.objects.filter(pk=article_id).first()
                    if not article_obj.blog.userinfo == request.user:
                        # 3.当前这篇文章用户是否已经点过
                        is_click = models.UpAndDown.objects.filter(user=request.user,article=article_obj).exists()
                        if not is_click:
                            # 操作数据库 完成数据修改
                            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'] = '点踩成功'
                            models.UpAndDown.objects.create(user=request.user,article=article_obj,is_up=is_up)
                        else:
                            back_dic['code'] = 2000
                            back_dic['msg'] = '你已经点过了不能在点了'
                    else:
                        back_dic['code'] = 3000
                        back_dic['msg'] = '你个臭不要脸的 不能给自己点'
    
                else:
                    back_dic['code'] = 4000
                    back_dic['msg'] = mark_safe('请先<a href="/login/">登录</a>')  #后端直接与前端交互
                return JsonResponse(back_dic)
    

    评论功能:

    from django.db import transaction
    
    def comment(request):
        if request.is_ajax():
            if request.method == 'POST':
                back_dic = {'code':1000,'msg':''}
                article_id = request.POST.get('article_id')
                content = request.POST.get('content')
                # parent_id如果有值那么正常存储 如果没有值也无所谓就存空 也符合要求
                parent_id = request.POST.get('parent_id')
                with transaction.atomic():
                    models.Comment.objects.create(user=request.user,article_id=article_id,content=content,parent_id=parent_id)
                    models.Article.objects.filter(pk=article_id).update(comment_num = F('comment_num') + 1)  #F(): 变量动态值的运算
                    back_dic['msg'] = '评论成功'
                return JsonResponse(back_dic)
    

    页面展示:

    #article_detail.html
    
    {% extends 'base.html' %}
    
    {% block css %}
        <style>
            #div_digg {
                float: right;
                margin-bottom: 10px;
                margin-right: 30px;
                font-size: 12px;
                 128px;
                text-align: center;
                margin-top: 10px;
            }
    
            .diggit {
                float: left;
                 46px;
                height: 52px;
                background: url(/static/img/upup.gif) no-repeat;
                text-align: center;
                cursor: pointer;
                margin-top: 2px;
                padding-top: 5px;
            }
    
            .buryit {
                float: right;
                margin-left: 20px;
                 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: #808080;
            }
        </style>
    {% endblock %}
    {% block content %}
        <div>
            <h2>{{ article_obj.title }}</h2>
            {{ 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">
                        <span class="info" style="color: red"></span>
                    </div>
                </div>
            </div>
            {#    点赞点踩样式结束 #}
                
            {#    评论楼渲染#}
            <div>
                <ul class="list-group">
                    {% for comment in comment_list %}
                        {#                    #15楼 2019-11-08 20:03 蔡彦辉的博客#}
                        <li class="list-group-item">
                            <span><a href="#">#{{ forloop.counter }}楼</a></span>
                            <span>{{ comment.create_time|date:'Y-m-d' }}</span>
                            <span><a href="/{{ comment.user.username }}/">{{ comment.user.username }}</a></span>
                            <span><a class="reply pull-right" username="{{ comment.user.username }}" comment_id="{{ comment.pk }}">回复</a></span>
                            <div>
                                {% if comment.parent %}
                                    <p>@{{ comment.parent.user.username }}</p>
                                {% endif %}
                                {{ comment.content }}
                            </div>
                        </li>
                    {% endfor %}
                </ul>
            </div>
    
    
            {#    评论开始#}
            {% if request.user.is_authenticated %}
                <div>
                    <p>发表评论</p>
                    <p>
                        昵称:<input type="text" id="tbCommentAuthor" class="author" disabled="disabled" size="50"
                                  value="{{ request.user.username }}">
                    </p>
                    <p>评论内容:</p>
                    <p>
                        <textarea name="comment" id="id_comment" cols="60" rows="10"></textarea>
                    </p>
                    <button class="btn btn-primary" id="id_submit">提交评论</button>
                </div>
            {% else %}
                <p><a href="{% url 'login' %}">登录</a>&nbsp;&nbsp;&nbsp;&nbsp;
                    <a href="{% url 'register' %}">注册</a></p>
    
            {% endif %}
    
            {#    评论结束#}
    
    
        </div>
    
        <script>
            // 点赞点踩
            $('.action').click(function () {
                let isUp = $(this).hasClass('diggit');
                let $target = $(this);
                $.ajax({
                    url: '/up_down/',
                    type: 'post',
                    data: {
                        'csrfmiddlewaretoken': '{{ csrf_token }}',
                        'is_up': isUp,
                        'article_id': "{{ article_obj.pk }}"
                    },
                    success: function (data) {
                        if (data.code == 1000) {
                            // 给span标签渲染信息
                            $('.info').text(data.msg);
                            // 点赞或点踩成功之后 应该将前端的数字也加一
                            let $span = $target.children();
                            let oldNum = $span.text();
                            $span.text(Number(oldNum) + 1)  // 转整型相加 不然就是字符串拼接了
                        } else {
                            $('.info').text(data.msg)
                        }
                    }
                })
            });
            // 评论
            // 提前定义一个全局变量parentId
            let parentId = null;
            $('#id_submit').click(function () {
                // 判断全局的parentid是否有值 如果有 你应该将前面的@人名
    切除
                let content =  $('#id_comment').val();
                if (parentId){
                    // 获取
    所在的索引值
                    let nIndex = content.indexOf('
    ') + 1;  // 索引顾头不顾尾 加一才能切到
                    // 按照nIndex切换文本内容
                    content = content.slice(nIndex)  // 将nIndex之前的内容直接去除  保留之后的内容
    
                }
    
                $.ajax({
                    url: '/comment/',
                    type: 'post',
                    data: {
                        'csrfmiddlewaretoken': '{{ csrf_token }}',
                        'content':content,
                        'article_id': '{{ article_obj.pk }}',
                        'parent_id':parentId
                    },
                    success: function (data) {
                        if (data.code == 1000){
                            // 临时渲染
                            let userName = '{{ request.user.username }}';
                            let content =  $('#id_comment').val();
                            let tmp = `
                            <li class="list-group-item">
                            <span><span class="glyphicon glyphicon-comment"></span><a href="/${ userName}/">${userName}:</a></span>
                            <p>
                                ${content}
                            </p>
                        </li>
    
                            `;
                            // 将生成好的内容添加到ul标签内部
                            $('.list-group').append(tmp);
                            // 将评论框中的内容清空
                            $("#id_comment").val('');
                            // 将全局的parentid再制成空null
                            parentId = null;
                        }
                    }
                })
            });
            // 点击回复按钮
            $('.reply').on('click',function () {
                // 如何获取想要评论的那条评论人的姓名
                let userName = $(this).attr('username');
                // 如何获取要评论的那条评论的主键值
                parentId = $(this).attr('comment_id');  // 赋值给全局的parentId
                // 回复按钮的三件事
                let headerMsg = '@' + userName + '
    ';
                $('#id_comment').val(headerMsg);
                $('#id_comment').focus();  // 让评论框自动聚焦
    
            })
        </script>
    {% endblock %}
    
  • 相关阅读:
    修改oracle用户密码永不过期
    mysql中的union操作(整理)
    mysql条件查询and or使用实例及优先级介绍
    vue实现购物清单列表添加删除
    vue实现全选框效果
    vue实现穿梭框效果
    legend3---13、vue是真的好用
    黑马在线教育项目---34-37、webuploader实现用户头像的异步上传
    lareval重命名created_at和updated_at字段
    js的dom操作(整理)(转)
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12026182.html
Copyright © 2020-2023  润新知