文章详情页的编写:

{% extends "base.html" %}

{% block content %}
{% csrf_token %}
<div class="article_info">
<h3 class="text-center title">{{ article_obj.title }}</h3>
<div class="cont">
{{ article_obj.content|safe }}
</div> <div class="clearfix">
<div id="div_digg">
<div class="diggit action">
<span class="diggnum" id="digg_count">{{ article_obj.up_count }}</span>
</div>
<div class="buryit action">
<span class="burynum" id="bury_count">{{ article_obj.down_count }}</span>
</div>
<div class="clear"></div>
<div class="diggword" id="digg_tips" style="color: red;"></div>
</div>
</div> <div class="comments list-group">
<p class="tree_btn">评论树</p>
<div class="comment_tree"> </div> <script> $.ajax({
url: "/get_comment_tree/",
type: "get",
data: {
article_id: "{{ article_obj.pk }}"
},
success: function (comment_list) {
console.log(comment_list); $.each(comment_list, function (index, comment_object) { var pk = comment_object.pk;
var content = comment_object.content;
var parent_comment_id = comment_object.parent_comment_id;
var s = '<div class="comment_item" comment_id=' + pk + '><span>' + content + '</span></div>'; if (!parent_comment_id) { $(".comment_tree").append(s);
} else { $("[comment_id=" + parent_comment_id + "]").append(s); } }) }
}) </script> <p>评论列表</p> <ul class="list-group comment_list"> {% for comment in comment_list %}
<li class="list-group-item">
<div>
<a href=""># {{ forloop.counter }}楼</a> &nbsp;&nbsp;
<span>{{ comment.create_time|date:"Y-m-d H:i" }}</span>&nbsp;&nbsp;
<a href=""><span>{{ comment.user.username }}</span></a>
<a class="pull-right reply_btn" username="{{ comment.user.username }}"
comment_pk="{{ comment.pk }}">回复</a>
</div> {% if comment.parent_comment_id %}
<div class="pid_info well">
<p>
{{ comment.parent_comment.user.username }}: {{ comment.parent_comment.content }}
</p>
</div>
{% endif %} <div class="comment_con">
<p>{{ comment.content }}</p>
</div> </li>
{% endfor %} </ul> <p>发表评论</p>
<p>昵称:<input type="text" id="tbCommentAuthor" class="author" disabled="disabled" size="50"
value="{{ request.user.username }}">
</p>
<p>评论内容:</p>
<textarea name="" id="comment_content" cols="60" rows="10"></textarea>
<p>
<button class="btn btn-default comment_btn">提交评论</button>
</p>
</div>
<script>
// 点赞请求
$("#div_digg .action").click(function () {
var is_up = $(this).hasClass("diggit"); $obj = $(this).children("span"); $.ajax({
url: "/digg/",
type: "post",
data: {
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
"is_up": is_up,
"article_id": "{{ article_obj.pk }}",
},
success: function (data) {
console.log(data); if (data.state) {
var val = parseInt($obj.text());
$obj.text(val + 1);
}
else {
var val = data.handled ? "您已经推荐过!" : "您已经反对过!";
$("#digg_tips").html(val); setTimeout(function () {
$("#digg_tips").html("")
}, 1000) } }
}) }) // 评论请求
var pid = ""; $(".comment_btn").click(function () { var content = $("#comment_content").val(); if (pid) {
var index = content.indexOf("\n");
content = content.slice(index + 1)
} $.ajax({
url: "/comment/",
type: "post",
data: {
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
"article_id": "{{ article_obj.pk }}",
"content": content,
pid: pid
},
success: function (data) { console.log(data); var create_time = data.create_time;
var username = data.username;
var content = data.content; var s = `
<li class="list-group-item">
<div> <span>${create_time}</span>&nbsp;&nbsp;
<a href=""><span>${username}</span></a> </div>
<div class="comment_con">
<p>${content}</p>
</div> </li>`; $("ul.comment_list").append(s); // 清空评论框
pid = "",
$("#comment_content").val(""); }
}) }); // 回复按钮事件 $(".reply_btn").click(function () { $('#comment_content').focus();
var val = "@" + $(this).attr("username") + "\n";
$('#comment_content').val(val); pid = $(this).attr("comment_pk"); })
</script> </div>
{% endblock %}

细节在于,在点赞的时候不必给两个按钮同时绑定事件,而是利用:

        <div class="clearfix">
<div id="div_digg">
<div class="diggit action">
<span class="diggnum" id="digg_count">{{ article_obj.up_count }}</span>
</div>
<div class="buryit action">
<span class="burynum" id="bury_count">{{ article_obj.down_count }}</span>
</div>
<div class="clear"></div>
<div class="diggword" id="digg_tips" style="color: red;"></div>
</div>
</div>

上面是点赞的编写,下面是事件的绑定,利用的是hasClass判断返回是否为空;

$("#div_digg .action").click(function () {
var is_up = $(this).hasClass("diggit");

来返回True或者是false。

在JS中ajax如何向python插入变量一样呢?就是利用了${变量名}来进行带入,如下代码:

$.ajax({
url: "/comment/",
type: "post",
data: {
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
"article_id": "{{ article_obj.pk }}",
"content": content,
pid: pid
},
success: function (data) { console.log(data); var create_time = data.create_time;
var username = data.username;
var content = data.content; var s = `
<li class="list-group-item">
<div> <span>${create_time}</span>&nbsp;&nbsp;
<a href=""><span>${username}</span></a> </div>
<div class="comment_con">
<p>${content}</p>
</div> </li>`; $("ul.comment_list").append(s);

注意当点击回复按钮的时候如何快速定位到回复为哪一位?

这里在回复的标签a标签中定义了独特的属性username和comment_pk

一个用于评论框的@一个用在判断父级标签nid

这个就相当于不会再数据库中存储@信息了。

Django具体操作(六)的更多相关文章

  1. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  2. Django models 操作高级补充

    Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra

  3. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  4. 从命令行运行django数据库操作

    从命令行运行django数据库操作,报错: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_T ...

  5. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  6. Django开发笔记六

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...

  7. django中操作cookie与session

    cookie 什么是Cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息. Cookie的 ...

  8. Windows server iis部署Django详细操作

    教程基于Windows server2012+Python3.6+IIS之上部署django的,同样适用于server2012之上的版本服务器和windows7以上的windows操作系统. 文章来自 ...

  9. [oldboy-django][2深入django]ORM操作

    推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...

  10. GIS基础软件及操作(六)

    原文 GIS基础软件及操作(六) 练习六.空间分析的应用 1.加深对缓冲区分析基本原理.方法的认识:2.熟练掌握距离制图创建缓冲区技术方法.3.掌握利用缓冲区分析方法解决地学空间分析问题的能力. 1. ...

随机推荐

  1. mysql每天凌晨0点准时启动taskeng.exe如何关闭

    MySQL弹出一个taskeng.exe. 内容如下:=====================Start Initialization====================mysql Instal ...

  2. redis 学习笔记3(哨兵模式下分布式锁的实现以及全局唯一id的生成)

    redis实现分布式锁和全局唯一id应该是较为常见的应用. 实现基于redis的setNX,以及incr命令.还是比较简单的! 搭建环境以及配置好sping整合,做了下测试,有兴趣的载下来看看,自己做 ...

  3. python学习笔记之函数的参数

    函数的参数有位置参数和关键字参数,位置参数一定要在关键字参数的前面,位置参数的优先级是高于关键字参数的,否则会报错 def my_abs(a,b): print(a) print(b) my_abs( ...

  4. 二维码API接口

    1.http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.54admin.net 2.http://b.bshare ...

  5. week5 0.1 安装materializecss

    用ATOM打开项目 App是什么呢?就是App.js 我们将不需要的删掉 用一下materialize(类似bootstrap的东西) 官网https://materializecss.com/ 想用 ...

  6. git-02 下载代码

  7. spring使用中ModelAttribute的内容被覆盖

    在前台以get方式向后台提交数据: 后台接收: 后台接收参数的时候,由于user里面也有一个属性为id,后台在接收参数的时候,User里面的id会被重新赋值,这是一个大坑.如果后续继续用User来做操 ...

  8. ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理

    ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理 计划时间:第二天下午 背景:数据量大,工程大 目的:自动化,批处理,定制业务流程,不写程序 教程:Pdf/343 数据:chap8/ex5 ...

  9. IIS 7配置需要注意的地方,RTX SDK运行必须Enable 32-bit Applications为True

    简单说一下IIS 7的配置里那些需要注意的 首先每个网站都必须运行在特定得程序池上,程序池的配置中,关键的几个如下图: 1. .Net Framework Version : 这个设置的是你项目用到的 ...

  10. 让Source Insight完美支持中文注释

    如何让source insight支持中文注释,解决回车删除,移动光标出现乱码的问题?下面是解决方案:     -------Source Insight3 中文操作(左右键.删除和后退键)支持宏-- ...