BBS第五天

点赞点踩

前端

1
2
3
4
5
6
7
urls:
re_path(r'^up_down/', views.up_down, name='up_down_view'),

前端页面
1.点赞点踩功能展示
2.发送ajax请求
文章id、is_up 、csrftoken

后端

1
2
3
4
1.先校验用户是否登录
2.判断用户是否已经点过了
3.判断当前文章是否是当前用户自己写的
4.操作数据库 更新数据

评论

前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
urls:
re_path(r'^comment/', views.comment, name='comment_view'),

1.前端页面搭建
textarea button
2.发送ajax请求
评论内容 文章id
3.后端逻辑代码
orm操作数据库
4.评论的展示
评论列表
5.功能完善
自动清空textarea框
临时渲染评论内容
模板字符串
6.回复按钮
点击之后 获取当前评论的用户名
并且自动填写textarea内容并换行 聚焦
7.提交评论
根评论与子评论使用的是同一个提交按钮
parentId
8.内容切割
9.评论渲染

后端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

def comment(request):
back_dic = {'code': 100, 'msg': ''}
if request.is_ajax():
if request.method == 'POST':
article_id = request.POST.get('article_id')
content = request.POST.get('content')
parent_id = request.POST.get('parent_id')
with transaction.atomic():
models.Article.objects.filter(pk=article_id).update(comment_num=F('comment_num') + 1)
models.Comment.objects.create(user=request.user, article_id=article_id, content=content,
parent_id=parent_id)
back_dic['msg'] = '评论成功'
return JsonResponse(back_dic)

后台管理

添加文章

前端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
urls配置
re_path(r'^backend/', views.backend),
re_path(r'^add_article/', views.add_article, name='add_article_view'),

使用富文本编辑器
<textarea name="content" id="editor_id" cols="30" rows="10"></textarea>

% block js %}
<script charset="utf-8" src="/bootstrap&jquery/kindeditor/kindeditor-all-min.js"></script>
<script>
KindEditor.ready(function (K) {
window.editor = K.create('#editor_id',{
width : '100%',
height: '450px',
resizeType: 1,
uploadJson : '/upload_image/', // 上传图片的后端提交路径
extraFileUploadParams : {
'csrfmiddlewaretoken': '{{ csrf_token }}'
}
});
});
</script>
{% endblock %}

后端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44


@login_required
def add_article(request):
if request.method == 'POST':
title = request.POST.get('title')
content = request.POST.get('content')
category_id = request.POST.get("category_id")
tag_id_list = request.POST.getlist('tag_id')
# bs4模块使用
soup = BeautifulSoup(content, 'html.parser')
tags = soup.find_all()
for tag in tags:
print(tag.name) # 获取页面所有的标签
# 针对script标签直接删除
if tag.name == 'script':
tag.decompose()

# 文章简介
# 1 先暴力的直接去切去content 150个字符
# desc = content[0:150]

# 2 截取文本150个
desc = soup.text[0:150]

article_obj = models.Article.objects.create(
title=title,
content=str(soup),
desc=desc,
category_id=category_id,
blog=request.user.blog
)
# 文章和标签的关系表 是我们自己创建的 没法使用add set remove clear方法
# 自己去操作关系表 一次性可能需要创建多条数据 批量插入bulk_create
article_obj_list = []
for i in tag_id_list:
tag_article_obj = models.Article2Tag(article=article_obj, tag_id=i)
article_obj_list.append(tag_article_obj)
models.Article2Tag.objects.bulk_create(article_obj_list)
return redirect('/backend/')

category_list = models.Category.objects.filter(blog=request.user.blog)
tag_list = models.Tag.objects.filter(blog=request.user.blog)
return render(request, 'backend/add_article.html', locals())

删除文章

1
2
3
4
5
6
7
8
9
urls配置
re_path(r'^delete/', views.article_delete),

@login_required
def article_delete(request):
article_id = request.GET.get("id")
models.Article.objects.filter(pk=article_id).delete()
return redirect('/backend/')

编辑文章

前端

1
2
3
urls配置
re_path(r'^edit_article/', views.edit_article, name='edit_article'),

后端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@login_required
def edit_article(request):
article_id = request.GET.get("id")
article_obj = models.Article.objects.filter(pk=article_id).first() # 当前所编辑的文章对象
category_list = models.Category.objects.filter(blog=request.user.blog) # 当前用户对应的所有分类列表
tag_list = models.Tag.objects.filter(blog=request.user.blog) # 当前用户对应的所有标签列表
selected_tag_queryset = models.Article2Tag.objects.filter(article=article_obj) # 当前编辑文章对应的Article2Tag对象列表
selected_tag_list = [i.tag_id for i in selected_tag_queryset] # 当前编辑文章已选中的tag

if request.method == 'POST':
'''获取post提交过来的数据'''
title = request.POST.get('title')
content = request.POST.get('content')
category_id = request.POST.get("category_id")
tag_id_list = request.POST.getlist('tag_id')

# 对传过来的文章内容进行过滤(防止xss攻击)
soup = BeautifulSoup(content, 'html.parser')
tags = soup.find_all()
for tag in tags:
# 针对script标签直接删除
if tag.name == 'script':
tag.decompose()
# 2 截取文本150个
desc = soup.text[0:150]

# 更新数据库
with transaction.atomic():
models.Article.objects.filter(pk=article_id).update(
title=title,
content=str(soup),
desc=desc,
category_id=category_id,
blog=request.user.blog
) ########## update和delete返回值都是操作的行数
print(article_obj)
models.Article2Tag.objects.filter(
article_id=article_id).delete() # 因为无法用批量更新,所以要先删除文章与标签关系表中的记录,再用bulk_create。
article_obj_list = []
for i in tag_id_list:
tag_article_obj = models.Article2Tag(article_id=article_id, tag_id=i)
article_obj_list.append(tag_article_obj)
models.Article2Tag.objects.bulk_create(article_obj_list)
return redirect('/backend/')
return render(request, 'backend/edit_article.html', locals())

修改用户头像和密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1.修改头像
urls:
re_path(r'^set/avatar/', views.set_avatar),

后端
@login_required
def set_avatar(request):
if request.method == 'POST':
file_obj = request.FILES.get('avatar')
# models.UserInfo.objects.filter(pk=request.user.pk).update(avatar=file_obj) # 不会再自动加avatar前缀
# 自己手动加前缀
user_obj = request.user
user_obj.avatar = file_obj
user_obj.save()
return redirect('/home/')
blog = request.user.blog
username = request.user.username
return render(request, 'set_avatar.html', locals())
re_path(r'^set_pwd/', views.set_pwd, name='set_pwd_view'),


2.修改密码
urls:re_path(r'^set_pwd/', views.set_pwd, name='set_pwd_view'),

后端
@login_required()
def set_pwd(request):
if request.method == 'POST':
back_dic = {'code': 10000, 'msg': ''}
old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')
confirm_password = request.POST.get('confirm_password')
is_right = request.user.check_password(old_password)
# 先判断原密码是否一致
if is_right:
# 再判断两次密码是否一致
if new_password == confirm_password:
request.user.set_password(new_password)
request.user.save()
back_dic['msg'] = '修改成功'
back_dic['url'] = '/login'
else:
back_dic['code'] = 10001
back_dic['msg'] = '两次密码不一致'
else:
back_dic['code'] = 10002
back_dic['msg'] = '原密码不正确'
return JsonResponse(back_dic)