• BBS项目小组件


    BBS

    将选中的图片展示到页面

    $("#id_file").change(function () {
            // 获取文件对象
            var fileObj = $(this)[0].files[0];
            // 利用内置对象 文件阅读器 FileReader
            var fileReader = new FileReader();
            // 将文件对象交给文件阅读器 生成文件对象的二进制数据
            fileReader.readAsDataURL(fileObj);  // 异步
            // DOM操作 修改img标签的src属性值
            fileReader.onload = function (){
                $('#id_img').attr('src',fileReader.result)
            }
        });
    

    FormData完成文件与数据同发送

    // 利用内置对象FormData完成既有普通键值又有文件数据的发送
            var formData = new FormData();
            // 添加普通键值对
            // formData.append('','')
            // console.log($('#myform').serializeArray());  // 会将form标签内 普通的键值对 自动组成一个数组的形式返回给你
            $.each($('#myform').serializeArray(),function (index,obj) {  // $.each(你想要被循环的对象,函数(索引,单个单个的对象))
                // console.log(index,obj)
                formData.append(obj.name,obj.value)  // 仅仅是将普通的键值对添加进去
            });
            // 添加文件数据
            formData.append('my_avatar',$('#id_file')[0].files[0]);
    

    循环错误并添加到输入框下

    $.each(data.msg,function (index,obj) {
         {#console.log(index,obj)#}
          var targetId = '#id_' + index;
           $(targetId).next().html(obj[0]).parent().addClass('has-error')
          })
    

    点击获取焦点

     // input框获取焦点事件
        $('input').focus(function () {
            // 将当前input所在的div移除has-error属性 并将下面的span标签内的内容也移除了
            $(this).next().html('').parent().removeClass('has-error')
        })
    

    form组件校验数据

    # 利用forms组件校验 普通字段的数据
            form_obj = RegForm(request.POST)
            if form_obj.is_valid():
                # 从cleaned_data拿到所有校验通过的数据
                clean_data = form_obj.cleaned_data
                """
                clean_data = {'username':'','password':'','confirm_password':'','email':''}
                """
                # 将confirm_password键值对从clean_data去除掉
                clean_data.pop('confirm_password')
                """
                clean_data = {'username':'','password':'','email':''}
                """
                avatar = request.FILES.get("my_avatar")
                # 如果用户没有选择头像 那么该值为空 只有当用户选择了自己的头像 才应该将avatar添加到clean_data字典中
                if avatar:
                    clean_data['avatar'] = avatar
                """
                clean_data = {'username':'','password':'','email':'','avatar':'文件对象'}
                """
                models.Userinfo.objects.create_user(**clean_data)
    

    生成一个随机图片验证码

    # 图片验证码相关视图函数
    from PIL import Image,ImageDraw,ImageFont
    from io import BytesIO
    import random
    # BytesIO 内存管理器 以二进制的形式帮你存储数据
    # Image自动生成图片
    # ImageDraw画笔对象
    # ImageFont字体
    
    # 生成三个随机数
    def get_random():
        return random.randint(0,255),random.randint(0,255),random.randint(0,255)
    
    def get_code(request):
        # 推到步骤一:rb模式打开后端已经存在了的文件 发送给前端
        # with open('static/image/333.jpg','rb') as f:
        #     data = f.read()
        # return HttpResponse(data)
    
        # 推到步骤二 借助于第三放模块动态生成图片
        # img_obj = Image.new('RGB',(260,35),'green')  # 生成了一个图片对象
        # # 先将文件对象存起来
        # with open('xxx','wb') as f:
        #     img_obj.save(f,'png')
        # # 在将图片以二进制模式读取
        # with open('xxx','rb') as f:
        #     data = f.read()
        # return HttpResponse(data)
        # 推到步骤三 文件存储找一个临时可以存的地方 图片颜色动态变化
        # img_obj = Image.new('RGB',(260,35),get_random())  # 第三个参数既可以放颜色英文 也可以放rgb参数
        # io_obj = BytesIO()  # 就把它当成文件句柄
        # img_obj.save(io_obj,'png')  # 图片格式必须得传
        # return HttpResponse(io_obj.getvalue())  # 获取二进制数据
        """
        1.文件存储麻烦
        2.文件颜色随机变化
        """
        # 最终不删减版
        img_obj = Image.new('RGB',(260,35),get_random())
        img_draw = ImageDraw.Draw(img_obj)  # 在当前图片上生成一个画笔
        img_font = ImageFont.truetype('static/font/222.ttf',30)
    
        # 图片验证码 (数字 小写字母 大写字母)  五位验证码  1aZd2
        # A-Z:65-90  a-z:97-122
        # 定义一个变量用来存储验证码
        code = ''
        for i in range(5):
            upper_str = chr(random.randint(65,90))
            lower_str = chr(random.randint(97,122))
            random_int = str(random.randint(0,9))
            # 从上面三个里面随机选择一个
            res = random.choice([upper_str,lower_str,random_int])
            img_draw.text((40 + i * 40, -5), res, get_random(), img_font)
            code += res
        print(code)
        # 保存
    
        io_obj = BytesIO()
        img_obj.save(io_obj,'png')
        # 找一个公共的地方 存储验证码 以便后续其他视图函数 校验
        request.session['code'] = code
        # 将写好字的图片返回出来
        return HttpResponse(io_obj.getvalue())
    
    #精简版
    def get_random():
        return random.randint(0,255),random.randint(0,255),random.randint(0,255)
    
    def get_code(request):
        img_obj = Image.new('RGB',(265,34),get_random())
        img_draw = ImageDraw.Draw(img_obj)
        img_font = ImageFont.truetype('static/font/1111.ttf',30)
    
        code = ''
        for i in range(5):
            int_str = str(random.randint(0,9))
            upper_str = chr(random.randint(65,90))
            lower_str = chr(random.randint(97,122))
            s = random.choice([int_str,upper_str,lower_str])
            img_draw.text((30+i*45,0),s,get_random(),img_font)
            code = code+s
    
        io_obj = BytesIO()
        img_obj.save(io_obj,'png')
        request.session['code'] = code
        return HttpResponse(io_obj.getvalue())
    

    删除用户编辑的srcpit标签

     # 能够帮我拿到当前用户写的所有的标签 将script删除
            res = BeautifulSoup(content,'html.parser')
            tags = res.find_all()
            for tag in tags:
                # print(tag.name)
                # 将script全部删除
                if tag.name == 'script':
                    tag.decompose()  # 删除指定的标签
            print(res.text)  # 获取用户输入的文本值
            desc = res.text[0:150]
    
            # # 文章简介(拿文本值的150个支付)
            # desc = content[0:150]
            models.Article.objects.create(title=title,content=str(res),desc=desc,blog=request.user.blog)
    

    django的事务

    def comment(request):
        back_dic = {'code':None,'msg':''}
        if request.is_ajax():
            comment = request.POST.get('comment')
            article_id = request.POST.get('article_id')
            parent_id = request.POST.get('parent_id')
            with transaction.atomic():
                # 在with代码块写的就是一个事务
                # 文章表修改comment_num字段
                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=comment,parent_id=parent_id)
            back_dic['code'] = 2000
            back_dic['msg'] = '评论成功'
        return JsonResponse(back_dic)
    

    侧边栏渲染功能

    1.模板继承 需要解决侧边栏展示的问题
    2.自定义inclusion_tag
    from django.template import Library
    register = Library()
    			
    @register.inclusion_tag('left_menu.html')
    def left_menu(username):
    # 将个人站点视图函数中侧边栏相关代码直接拷贝过来 需要什么补什么
    				...
    3.使用 {% load my_tag %}   {% left_menu username %}
    
  • 相关阅读:
    20130118
    延迟加载、分页显示等功能的增加
    ==和Equals的区别
    20160115--Hibernate
    20160108--搜索查询
    20150105
    20151229--数据表格
    20151226--easyUI
    DreamWeaver使用技巧(转)
    20121109
  • 原文地址:https://www.cnblogs.com/huanghongzheng/p/11272838.html
Copyright © 2020-2023  润新知