注册功能

BBS注册功能

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% load static %}
    <script src="{% static 'bootstrap/js/jquery.js' %}"></script>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>

</head>
<body>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <h2 class="text-center">注册</h2>
            <form id="myform" novalidate>
                {% csrf_token %}  #为了通过中间件校验
                {% for foo in form_obj %} 对后端传来的form组件的列表进行循环
                    <div class="form-group">
                        <label for="{{ foo.auto_id }}">{{ foo.label }}</label> #for是用来和input绑定的, foo里面有label属性
                        {{ foo }} #是一个个input框,有id属性的
                        <span style="color: red" class="pull-right"></span>
                    </div>
                {% endfor %}
                <div class="form-group">
                    <label for="myfile">头像
                        <img src="/static/img/default.png" alt="" width="80" style="margin-left: 10px" id="myimg">
                    </label>
                    <input type="file" id="myfile" name="avatar" style="display: none">
                </div>
                <input type="button" class="btn btn-success pull-right" value="注册" id="commit">
            </form>
        </div>
    </div>
</div>
<script>
    //当标签的src发生了变化的时候,就变化。
   $('#myfile').change(function () {
        // 文件阅读器
        //1 产生一个文件阅读器对象
        var fileReader = new FileReader();
        //2 获取用户上传的文件
        var fileObj = $(this)[0].files[0];
        //3 让文件阅读器读取该文件
        fileReader.readAsDataURL(fileObj);  // 这一步是异步 提交完之后直接运行下一行
        //4 利用文件阅读器将文件展示出来
        fileReader.onload = function () {
            $('#myimg').attr('src', fileReader.result)
        }
    });
	//点击事件,用FormData对象来传键值对和文件
    $('#commit').click(function () {
        var formDataObj = new FormData();
        //在前面的form组件传来的对象外层用了一个 form 表单,这时候就有用处了,可以通过serializeArray()自动获取到内部所有的普通键值对
        $.each($('#myform').serializeArray(),function (index,obj) {
            formDataObj.append(obj.name,obj.value);
        });
        //把文件内容放进去了。
        formDataObj.append('avatar',$('#myfile')[0].files[0]);

		//通过ajax来传送
        $.ajax({
            url:'',
            type:'post',
            //把上面的FormData对象放进去
            data:formDataObj,
            //必要的两个参数
            contentType:false,
            processData:false,
            success:function (data) {
                if (data.code == 1000){
                    window.location.href = data.url
                }else {
                    //后端传来的错误信息正好加一个id_就是前面input框的id
                    $.each(data.msg,function (index,obj) {
                        var targetId = '#id_'+ index;
                        $(targetId).next().text(obj[0]).parent().addClass('has-error')
                    })
                }
            }
        })
    });
    $('input').focus(function () {
        $(this).next().text('').parent().removeClass('has-error')
    })
</script>
</body>
</html>

后端代码:

def register(request):
    form_obj = myforms.MyRegForm()
    if request.method == 'POST':
        back_dic = {'code':1000,'msg':''}
        form_obj = myforms.MyRegForm(request.POST)#这里的form_obj名字一定要和上面的一样,虽然是两个对象,但是前段解析的时候用的是同一个名字。
        if form_obj.is_valid():#如果数据没有问题的话
            clean_data = form_obj.cleaned_data
            clean_data.pop('confirm_password')
            file_obj = request.FILES.get('avater')

            if file_obj:# 获取用户上传到头像之后 一定要做判断 判断用户是否上传了  如果没有上传  字典中就不加avatar键值对
                clean_data['avatar'] = file_obj

            models.UserInfo.objects.create_user(**clean_data)
            back_dic['url'] = '/login' #直接跳转到登录界面
        else:
            back_dic['code'] = 2000
            back_dic['msg'] = form_obj.errors #把错误的信息的键值对全放进去
        return JsonResponse(back_dic) #通过序列化,返回前端ajax的success
    return render(request,'register.html',locals())
posted @ 2019-11-12 21:38  chanyuli  阅读(137)  评论(0编辑  收藏  举报