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 %}

BBS_02day的更多相关文章

随机推荐

  1. oracle聚合函数XMLAGG用法简介

    XMLAGG函数语法基本如图,可以用于列转行,列转行函数在oracle里有好几种方法,wm_concat也可以做 这里介绍wm_concat是因为XMLAGG实现效果和wm_concat是一样的,只是 ...

  2. h5中的audio音频标签与对应的dom对象

    HTML5中提供了一个<audio>标签,同时也提供了一个Audio对象给JavaScript去操作,这个对象属于HTML的DOM对象. H5中的<audio>标签 此标签是H ...

  3. 数据持久化之bind Mounting

    一.默认情况 1.创建一个Nginx测试镜像 Dockerfile: FROM nginx:latest WORKDIR /usr/share/nginx/html COPY index.html i ...

  4. 如何配置Memcached高速缓存,加快wordpress的速度

    Memcached是什么 Memcached是一种高性能的分布式内存对象缓存系统.在动态应用,Memcached既能提高访问的速度,同时还减低了数据库的负载.DangaInteractive为提升Li ...

  5. 【题解】Ples [COCI2011]

    [题解]Ples [COCI2011] 依旧是没有传送门,只有提供了数据的官网. [题目描述] \(N\) 个汉子和 \(N\) 个妹纸一起参加舞会,跳舞时只能是一个汉子一个妹纸配对,现在给出每个人的 ...

  6. PIE属性表多字段的文本绘制

    最近研究了PIE SDK文本元素的绘制相关内容,因为在我们的开发中,希望可以做到在打开一个Shp文件后,读取到属性表的所有字段,然后可以选择一些需要的字段,将这些字段的所有要素值的文本,绘制到shp图 ...

  7. Linux CentOS内核升级

    1. 说明 正在使用的阿里云服务器报了几个内核漏铜,使用自带[一键修复]需要额外的支付费用,所以尝试采用升级系统内核的方式来修复漏洞. 1.1 服务器参数 操作系统:CentOS 7.4 64位 当前 ...

  8. 使用jqPrint.js调用浏览器打印界面,打印网页中的某一部分该部分含有ECharts图表

    1.准备好js文件(我用的是谷歌浏览器) 这个文件是为了防止你的jQuery版本过高而不适配的问题 这是调用浏览器打印的js插件 2.引入js文件 <script src="js/jq ...

  9. loadView的原理

    其他的小记: 1.控制器的view是怎么创建的 当外界第一次使用当前控制器的view时,会调用当前一个方法loadView,创建控制器的view: 控制器的view是懒加载的,什么时候使用,什么时候才 ...

  10. 苹果审核之遇到IPV6问题被拒的解决方法

    情景: 等待苹果审核上线时,发现因为IPV6被拒了.这是悲剧,以下是苹果审核给我的理由: We discovered one or more bugs on Wi-Fi connected to an ...