其他分享
首页 > 其他分享> > day 75 后天管理、 添加文章、修改用户头像

day 75 后天管理、 添加文章、修改用户头像

作者:互联网

内容回顾

# 先写根评论
  先把整体的评论功能跑通 再去填补
  1.书写前端获取用户评论的标签
	可能点赞点踩由浮动带来的影响
    	clearfix
  2.点击评论按钮发送ajax请求
	
  3.后端针对评论单独开设url处理
	后端逻辑其实非常简单非常少
    
  4.针对根评论涉及到前端的两种渲染方式
	1.DOM操作临时渲染评论楼
      需要用到模板字符串
             let userName = '{{ request.user.username }}'
                        let temp = `
                             <li class="list-group-item">

                                <span>${userName}</span>
                                <span><a href="">回复</a></span>
                                <div>
                                    ${conTent}
                                </div>
                            </li>
                        `
                        $(".list-group").append(temp);
    2.页面刷新永久渲染
    	后端直接获取当前文章对应的所有评论 传递给html页面
        前段利用for循环参考博客园评论楼渲染样式渲染
        
    3.评论框里面的内容需要清空
# 在考虑在评论
  从回复按钮入手
    点击恢复按钮发生了什么事
      1.评论框自动聚焦 .focus()
      2.评论框里面自动添加对应评论的评论人姓名
    	@username\n
    思考:
        1.根评论和子评论点的是同一个按钮
        2.根评论和子评论的区别
        	其实之间的ajax代码只需要添加一个父评论id即可
	点击回复按钮之后 我们应该获取根评论对应的用户名和主键值
    针对主键值 多个函数都需要用 所以用全局变量的形式存储
    
    针对子评论内容 需要切割出不是用户写的 @username\n
     if(parentID){
                // 先找到\n对应的索引 然后利用切片 但是切片是顾头不顾尾的 所有要索引+1
                let indexNum = conTent.indexOf('\n') +1;
                conTent = conTent.slice(indexNum) // 将indexNum之前的所有数据切除 只保留后面的部分
            }
        
 	后端parent字段本来就可以为空,所有传不传值都可以直接存储数据
    
    前端针对子评论需要在渲染额外的判断
       判断当前评论是否是子评论 如果是需要渲染对应的评论人名#}
            {% if comment.parent_id %}
                <p>@{{ comment.parent.user.username }}</p>
            {% endif %}
                {{ comment.content }}
                
	前端parentId字段每次提交之后需要手动清空
    

今日内容详细

后台管理

"""
当一个文件夹下文件比较多的时候 你还可以继续创建文件夹分类处理
	templates文件夹
		backend文件夹
		应用1文件夹
		应用2文件夹
"""

添加文章

有两个需要注意的问题
	1.文章的简介
      不能直接切取
        应该先想办法获取当前页面的文本内容之后截取150个文本字符
        
	2.xss攻击
    针对用户直接编写html代码的网址
    针对用户直接书写的script标签 我们需要处理
    	1.注释标签内部的内容
        2.直接将script删除
        
如果解决
	针对1 后端通过正则表达式筛选出
	针对2 首先需要确定及获取script标签
	beautifulsoup模块  bs4模块
      专门用来帮你处理html页面内的
      该模块主要应用于爬虫程序
    下载不要下错了
    pip3 install baeutifulsoup4
    
		# 模块使用
        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]
"""
当你发现一个数据处理起来不是很方便的时候 
可以考虑百度搜搜有没有现成的模块帮你完成相应的功能
"""

kindeditor富文本编辑器

编辑器的种类有很多,你可以自己去网上搜索

编辑器如何上传图片

别人写好的接口 但是借口不是你自己的
你需要手动去修改

# 在使用别人的框架或者模块的时候 出现问题不要慌 看看文档可能会对应的处理方法

修改用户头像

@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前缀
        # 1.自己手动加前缀
        # 2.换一种更新方式
        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())

bbs项目总结

"""
在开发任意的web项目的时候 其实到了后期需要写的代码会越来越少
都是用已经写好的url填写到a标签href属性完成跳转即可
"""
主要功能总结
	表设计  开发流程
    注册功能
    	forms组件使用
        头像动态展示
        错误信息提示
    登录功能
    	图片验证码
        滑动验证码
    首页展示
    	media配置
        主动暴露任意资源接口
	个人站点展示
    	侧边栏展示
        侧边栏筛选
        侧边栏inclusion_tag制作
	文章详情页
    	点赞点踩
        评论
	后台管理
"""
针对bbs需要掌握每一个功能的书写思路 内部逻辑
之后再去敲代码熟悉 找感觉
"""

标签:request,html,头像,75,tag,评论,user,day,页面
来源: https://www.cnblogs.com/md-my/p/15862852.html