Django 项目试炼blog(7) -- 文章详情页2 -- 前端样式的继承与楼评论显示

views

from django.db import transaction
def comment(request):
    article_id = request.POST.get(‘article_id‘)
    content = request.POST.get(‘content‘)
    pid = request.POST.get(‘parent_id‘)

    #事务操作 生成评论,文章数据中评论总数自动+1(同时执行)
    with transaction.atomic():
        comm_obj = Comment.objects.create(user_id=request.user.pk,content=content,article_id=article_id,parent_comment_id=pid)
        Article.objects.filter(pk=article_id).update(comment_count=F(‘comment_count‘)+1)

    send_info = {}
    # create_time:<class ‘datetime.datetime‘>   json序列化无法对对象进行序列换
    send_info[‘create_time‘] = comm_obj.create_time.strftime("%Y-%m-%d %X")
    send_info[‘username‘] =request.user.username
    send_info[‘content‘] = comm_obj.content
    if pid:
        # 如果有父评论
        parent_obj_name =Comment.objects.filter(pk=pid).values(‘user__username‘).first()
        send_info[‘parent_name‘] = parent_obj_name[‘user__username‘]
        parent_obj = Comment.objects.filter(pk=pid).first()
        send_info[‘parent_content‘] = parent_obj.content

    return JsonResponse(send_info)


HTML

HTML中的母版样式
.....
{% block name %}  

{% endblock %}
继承模板
{% extends ‘base.html‘ %}
{% block name %}

新填的内容(html,css,jquery)

{% endblock %}
<div class="comment_box">
            <ul class="list-group" id="comm_list"><span>评论区</span>
            {% for comment in comment_list %}
                <li class="list-group-item">
                    <p><span>#{{ forloop.counter }}楼</span> &nbsp; &nbsp; &nbsp;
                        <span>{{ comment.create_time|date:‘Y-m-d H:m‘ }}</span>&nbsp; &nbsp; &nbsp;
                        <a href="">{{ comment.user.username }}</a>
                        <span class="pull-right re_comm" username="{{ comment.user.username }}" comment_pk="{{ comment.pk }}">
                        {#自定义属性 username用于点击回复时,自动@评论人#}
                        {#自定义属性 comment_pk标识此为父评论#}
                            <a>回复</a></span>
                    </p>
                    {% if comment.parent_comment_id %}
                            {#判断是否有父评论#}
                    <div class="well">
                    <p>
                        {{ comment.parent_comment.user.username }}:{{ comment.parent_comment.content }}
                    </p>
                    </div>
                    {% endif %}

                    <p>&nbsp; &nbsp; &nbsp;{{ comment.content }}</p>
                </li>
            {% endfor %}
            </ul>
        </div>


Jquery

            //评论提交
            var parent_id = ‘‘;
            $(‘#btn‘).click(function () {
                var content = $(‘#tbCommentBody‘).val();
                if(parent_id){    //即为子评论
                    var index = content.indexOf(‘\n‘);
                    content = content.slice(index+1)
                } // 回复评论判断后,切片后存入数据库

                $.ajax({
                    url:"/comment/",
                    type: ‘post‘,
                    async:false,
                    data:{
                        ‘csrfmiddlewaretoken‘:$("[name=‘csrfmiddlewaretoken‘]").val(),
                        ‘article_id‘:"{{ art_obj.pk }}",
                        ‘content‘:content,
                        ‘parent_id‘: parent_id,
                    },
                    success:function (data) {
                        var create_time= data[‘create_time‘];
                        var username = data[‘username‘];
                        var content = data[‘content‘];

                        if(!parent_id){
                            //字符串拼接标签样式
                            var com =‘<li class="list-group-item"><span>‘+create_time+
                                ‘</span>&nbsp; &nbsp; &nbsp;<a href="">‘+username+
                                ‘</a><span class="pull-right"><a>回复</a></span> <p>&nbsp; &nbsp; &nbsp;‘+content+
                                ‘</p> </li>‘;
                        $(‘#comm_list‘).append(com);
                        }else{
                            var parent_name = data[‘parent_name‘];
                            var parent_content = data[‘parent_content‘];

                            //ES6用法,连标签模块一起插入
                            com = `<li class="list-group-item">
                                    <span>${create_time}</span>&nbsp; &nbsp; &nbsp;
                                    <a href="">${username}</a>
                                    <span class="pull-right re_comm">
                                    <a>回复</a></span>
                                    <div class="well">
                                    <p>
                                        ${ parent_name }:${parent_content}
                                    </p>
                                    </div>
                                    <p>&nbsp; &nbsp; &nbsp;${content}</p></li>`;
                        $(‘#comm_list‘).append(com);
                        }
                        //清空评论框 与parent_comment_id
                        parent_id = ‘‘;
                        $(‘#tbCommentBody‘).val(‘‘)
            }
            })
        });

            //回复事件
            $(‘.re_comm‘).click(function () {
                $(‘#tbCommentBody‘).focus();
                $(‘#tbCommentBody‘).val(‘@‘+$(this).attr(‘username‘)+‘\n‘);  //利用标签自定义属性
                {#点击回复即给当前评论赋值parent_comment_id#}
                parent_id = $(this).attr(‘comment_pk‘)
            })

        });


重点

1、给前端ajax 时间数据时,后端存储的是datetime.datetime对象。需要转换成格式化的字符串

2、回复内容切片后存储发送

3、运用字符串拼接、ES6,动态添加标签

4、HTML中标签自定义属性的运用,点击回复按钮(产生子评论),自动添加@+名字,给parent_id赋值传给后端。ajax处理完后进行数据清空

5、评论两种显示:render显示,ajax动态显示

原文地址:https://www.cnblogs.com/zhuzhiwei-2019/p/10777289.html

时间: 2024-11-08 16:59:37

Django 项目试炼blog(7) -- 文章详情页2 -- 前端样式的继承与楼评论显示的相关文章

Django 项目试炼blog(8) -- 评论树的显示

Views def get_tree_data(request): article_id = request.GET.get('article_id') send_data = list(Comment.objects.filter(article_id=article_id).values('pk','content','parent_comment_id')) return JsonResponse(send_data,safe=False) ORM生成的的是queryset对象,而非真正的

Django 项目试炼blog(6) -- 文章详情页1 -- 点赞功能

url #文章详情页 re_path(r'(?P<username>\w+)/article/(?P<article_id>\d+)/$',views.article), # 点赞 path('up_down/', views.up_down), views from django.db.models import F def up_down(request): sign = request.POST.get('sign') sign = json.loads(sign) # 前端

django 项目试炼blog(1)

1.确定表结构 from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用户信息表, 继承session生成的auth_user表 需要在setting中加入 AUTH_USER_MODEL = 'app01.UserInfo' """ nid = models.AutoField(primary_key=True) telepho

Django 项目试炼blog(10) --补充 滑动验证码

首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django 3.1.0 social-auth-core 3.0.0 然后可以来我的github,下载关于滑动验证码的这个demo:https://github.com/Edward66/slide_auth_code 下载完后启动项目 python manage.py runserver 启动这个项目后,在主页就能看到示例

Django 项目试炼blog(9) -- 文本编辑器的使用(文件存储,预览)

HTML <div class="col-md-9"> <div> <p class="text-center" style="background-color: #e5eef7;font-size: 18px" >添加文章</p> <form action="" method="post" style="margin-top: 40px&qu

6 功能4:文章详情页

1.文章详情页的设计 # 文章详情页 re_path(r'^(?P<username>\w+)/articles/(?P<article_id>\d+)$', views.article_detail, name='article_detail'), 2.文章详情页的数据构建 def article_detail(request, username, article_id): """文章详情页""" user_obj =

文章详情页

一.文章详情页访问设计 访问文章详情页,访问文章路径类似:https://www.cnblogs.com/wupeiqi/articles/3148888.html 参照访问路径编写文章详情页路由如下: urlpatterns = [ ... # 文章详情页 re_path('^(?P<username>\w+)/articles/(?P<article_id>\d+)$', views.article_detail), ] 二.文章详情页的数据构建 文章详情页的head部分和左侧

BBS - 文章详情页

一. 文章详情页的设计和数据构建 url.py # 文章详情页 re_path('^(?P<username>\w+)/articles/(?P<article_id>\d+)$', views.article_detail), # \w+:数字和字母 views.py def get_query_data(username): # 查询相关的数据,获取分类的数据 ''' 由于数据很多个地方需要用到,所以可以解耦出来,单独写一个函数 :param username: :return

博客2.0--第一版文章详情页留念

新版文章详情页>>http://blog.51cto.com/itstyle/2127815 原文地址:http://blog.51cto.com/51ctoblog/2129401