博客系统 之 注册

注册

 

之前我们学过的form组件为我们书写form表单带来了很大的便捷,给我们节省了代码,下面我们用form组件来做这个注册页面。

form组件设置标签。

forms.py

from django import forms
from django.forms import widgets
from .models import UserInfo
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError


# 创建form组件
class RegisterForm(forms.Form):
    user = forms.CharField(max_length=10, label="用户名",
                           widget=widgets.TextInput(attrs={"class": "form-control"}))
    pwd = forms.CharField(min_length=4, label="密码",
                          widget=widgets.PasswordInput(attrs={"class": "form-control"}))
    repeat_pwd = forms.CharField(min_length=4, label="确认密码",
                                 widget=widgets.PasswordInput(attrs={"class": "form-control"}))
    email = forms.EmailField(label="邮箱",
                             widget=widgets.EmailInput(attrs={"class": "form-control"}))
    
    '''校验文本框中输入的值是否与form组件设置的样式相匹配'''
    def clean_user(self):  # 局部钩子
        val = self.cleaned_data.get("user")

        ret = UserInfo.objects.filter(username=val)
        if not ret:    #数据库中不存在此用户,则可以注册
            return val
        else:   #此用户已注册
            raise ValidationError("该用户已存在")

    def clean(self):  # 全局钩子
        if self.cleaned_data.get("pwd") == self.cleaned_data.get("repeat_pwd"):  #判断密码是否一致
            return self.cleaned_data
        else:
            raise ValidationError("两次密码不一致,请重新输入!") 

注册页面需要的文本框已设置完毕,现在我们让它在html页面展现出来。

注册页面HTML:

register.html

<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="">
              {% for field in form %}
                <div class="form-group">
                    <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                    {{ field }} <span class="error pull-right"></span>
                </div>
                 {% endfor %}
                <div class="form-group">
                    <label for="avatar">头像<img  class="avatar" src="/static/img/default.png" alt=""></label>
                    <input type="file" id="avatar">
                </div>
                <input type="button" class="btn btn-primary register_btn pull-right" value="提交">
                            <span class="error" style="color: red;margin-left: 20px"></span> </form> </div> </div> </div> 

为html页面添加css样式,来装饰它的页面样式。

<style>
        {# 全局样式#}
        .container{
            margin-top: 100px;
        }
        {#头像#}
        #avatar{
            display:none;
        }
        .avatar{
            width: 60px;
            height: 60px;
            margin-left: 20px;
        }
    </style>

页面中有个注册按钮和头像选择需要,我们为它们设置事件。

注意:中间件

{% csrf_token %}

  

<script>
    //图像预览效果
{#    $("#avatar").on("change",function () {#}
        {# alert(123)#}
{#        var choose_file=$(this)[0].files[0];  //选择的文件#}
{#        var reader=new FileReader();    #}
{#        reader.readAsDataURL(choose_file);  //读选文件的URL#}
{#        $(".avatar").attr("src",reader.result)   //url赋给头像#}
{#    })#}
     //图像预览效果
    $("#avatar").on("change",function () {
        {# alert(123)#}
        var choose_file=$(this)[0].files[0];  //选择的文件
        var reader=new FileReader();
        reader.readAsDataURL(choose_file);  //读选文件的URL
        reader.onload=function () {   //等读取路径执行完才执行赋值
          $(".avatar").attr("src",reader.result)   //url赋给头像
        }

    });

{#    注册事件#}
    $(".register_btn").on("click",function () {
        var formdata=new FormData();  //实例化对象
        formdata.append("user",$("#id_user").val());
        formdata.append("pwd",$("#id_pwd").val());
        formdata.append("repeat_pwd",$("#id_repeat_pwd").val());
        formdata.append("email",$("#id_email").val());
        formdata.append("avatar",$("#avatar")[0].files[0]);
        formdata.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val());

        $.ajax({
            url:"",
            type:"post",
            processData:false,
            contentType:false,
            data:formdata,
            success:function (data) {
                if(data.user){
                    {# 注册成功#}
                    location.href="/login/"  //跳转到登录页面
                }else{ //注册失败
                    console.log(data.error_dict);
                    //清空错误信息
                    $("form span").html("");//所有span标签内容清空
                    $("form .form-group").removeClass("has-error"); //清空边框颜色
                    //加载错误信息
                    $.each(data.error_dict,function (field,error_list) {   //循环错误信息

                        if(field=="__all__"){ //全局错误信息
                            $("#id_repeat_pwd").next().html(error_list[0]).css("color","red");   //span标签添加内容字体变红
                            $("#id_repeat_pwd").parent().addClass("has-error")  //边框变红
                        }
                        $("#id_"+field).next().html(error_list[0]).css("color","red");   //span标签添加内容字体变红
                        $("#id_"+field).parent().addClass("has-error")  //边框变红
                    })
                    }
            }

        })
    })
</script> 

前端页面就这样吧,我们与后端做连接。

urls.py

 # 注册页面
    url(r'^register/', views.register),  

根据url在views视图中找到对应的函数。

views.py

# 注册
def register(request):
    if request.method == "POST":
        res = {"user": None, "error_dict": None}  # 设置初始值
        form = RegisterForm(request.POST)  # 接收前端传过来的数据
        if form.is_valid():  # 验证通过
            print(form.cleaned_data)
            print(request.FILES)  # 头像文件
            # 取到前端输入的值
            user = form.cleaned_data.get("user")
            pwd = form.cleaned_data.get("pwd")
            email = form.cleaned_data.get("email")
            avatar = request.FILES.get("avatar")
            if avatar:  # 上传了头像
                user = UserInfo.objects.create_user(username=user, password=pwd, email=email, avatar=avatar)
            else:  # 没有上传头像,则使用默认头像
                user = UserInfo.objects.create_user(username=user, password=pwd, email=email)
            res["user"] = user.username
        else:  # 验证不通过
            print(form.errors)
            print(form.cleaned_data)
            res["error_dict"] = form.errors  # 返回错误信息
        return JsonResponse(res)
    form = RegisterForm()  # form对象  ,渲染input标签,传一个字典
    return render(request, "register.html", locals())  # locals:form=form  

好了,注册就这样吧。

注意:注册页面涉及到了头像文件上传功能。

详见Django框架中文件上传,请前往:http://www.cnblogs.com/gaoya666/articles/8854919.html  

 

 

posted @ 2018-06-08 21:56  高~雅  阅读(165)  评论(0编辑  收藏  举报