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;
width: 128px;
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;
} .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: #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是否有值 如果有 你应该将前面的@人名\n切除
let content = $('#id_comment').val();
if (parentId){
// 获取\n所在的索引值
let nIndex = content.indexOf('\n') + 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 + '\n';
$('#id_comment').val(headerMsg);
$('#id_comment').focus(); // 让评论框自动聚焦 })
</script>
{% endblock %}

最新文章

  1. 窥探Swift之数组安全索引与数组切片
  2. javascript俄罗斯方块游戏
  3. [NHibernate]NHibernate.Tool.hbm2net
  4. OpenCV MAT基本图像容器
  5. git bash下的选择、复制、粘贴
  6. VC、MFC中设置控件的背景色、标题、字体颜色、字体要注意的地方[转]
  7. WPF编译时提示“...不包含适合于入口点的静态‘Main’方法 ...”
  8. C# 中经常用到的HTTP请求类,已封装get,post,delete,put
  9. Xcode 新版本如何设置ARC
  10. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图
  11. 二叉树的递归遍历 Tree UVa548
  12. .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)
  13. 顶级项目孵化的故事系列——Kylin的心路历程【转】
  14. linux调度器源码分析 - 初始化(二)
  15. Redis 性能问题的记录
  16. MySQL Crash Course #01# Chapter 1. 2 概念. Primary key
  17. javascript知识点积累
  18. PowerDesigner 表模型图展示列信息
  19. 20155307《Java程序设计》实验二实验报告
  20. BZOJ4820 Sdoi2017 硬币游戏 【概率期望】【高斯消元】【KMP】*

热门文章

  1. jquery ajax怎么使用jsonp跨域访问
  2. kmp算法笔记(简单易懂)
  3. Vue.js 源码分析(二十二) 指令篇 v-model指令详解
  4. jenkins环境自动部署
  5. spring boot测试类自动注入service或dao
  6. JVM的监控工具之jstack
  7. java函数式编程的形式
  8. c# Equal函数 and 运算符&#39;==&#39; (原发布 csdn 2017年10月15日 20:39:26)
  9. 使用Python+Selenium模拟登录QQ空间
  10. SAP 同一个序列号可以同时出现在2个不同的HU里?