zoukankan      html  css  js  c++  java
  • Django-利用Form组件和ajax实现的注册

    利用Form组件和ajax实现的注册

    一、注册相关的知识点

    1、Form组件

    我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放

    2、局部钩子函数

     def clean_username(self):
            username = self.cleaned_data.get("username")
            valid = models.UserInfo.objects.filter(username = username).first()
            if valid:
                raise ValidationError("用户名已存在")
            return username

    3、全局钩子函数

    #自定义全局钩子:验证两次密码是否一致
     def clean(self):
       if self.cleaned_data.get("password") == self.cleaned_data.get("password_again"):
            return self.cleaned_data
       else:
            raise  ValidationError("两次密码不一致")

    4、 jQuery的属性操作相关的

    attr:
        一个参数是获取属性的值,两个参数是设置属性值
    removeAttr(属性名):
        删除属性值
    prop:
        适应于属性的返回值是布尔类型的(单选,反选,取消的例子)
    removePorp:
        删除属性的值

    5、循环的两种方式:

    $.each(数组/对象,function(i,v){})
    $("div").each(function(i,v){})

    6、css中的三种隐藏:

    1、display:none  隐藏所有内容
    2、visibility:hidden 隐藏内容 3、overflow:hidden 隐藏溢出内容 三者都是用来隐藏的: 区别在于: visibility虽然隐藏了,但是被隐藏的内容依然占据这空间,这段隐藏了的内容却保留空间的位置会在网页中显示空白
    而display:隐藏了不占用空间 我们在注册的时候不用display:none,不然选择文件的那个功能就没有了,我们可以吧透明度

    7、提交二进制数据用FormData

    var formData=new FormData();
    formData.append("username",$("#id_username").val()); 
    formData.append("email",$("#id_email").val()); formData.append("tel",$("#id_tel").val());
    formData.append("password",$("#id_password").val()); formData.append("password_again",$("#id_password_again").val()); formData.append("avatar_img",$("#avatar")[0].files[0]);

    记得要加上

    contentType:false
    processData:false

    8、可以用下面的方法判断是什么请求

    if request.ajax():    #如果ajax请求
    if request,method=="POST":   #如果是POST请求

    9、上传文件有一个固定的配置参数media,和static相似 但又不同

    步骤如下:

    - 首先在settings中配置:

    # ============media配置===============
    MEDIA_URL="/media/"  #别名
    MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","uploads")   #具体路径

    - 在url中配置

    url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

    用处:

    用处一:
    ----- avatar = models.FileField(verbose_name='头像', upload_to='avatar', default="/avatar/default.png") 会把接收的文件放在media指代的路径与upload_to的拼接:BASE_DIR+blog+media+uploads+avatar/a.png avatar字段在数据库中保存的是:avatar/a.png
    用处二:
    ------ <img src="/media/avatar/a.png">

    如果上传成功会把图片自动保存在这里

    10、头像图片预览

       //头像预览
            $(".avatar_file").change(function () {
                var ele_file = $(this)[0].files[0]; //当前选中的文件
                var reader = new FileReader();
                reader.readAsDataURL(ele_file); //对应找到打开的url
                reader.onload=function () {
    {#                方式一#}
                    $(".avatar_img").attr("src",this.result) ; //this.result是上面找到的url
    {#                方式二#}
    {#                 $(".avatar_img")[0].src=this.result; //设置图片属性#}
                }
            })

    11、form自动生成的错误信息

    当你定义了全局钩子的时候,而且正好出现你的那个全局钩子函数中的错(比如两次密码输入不一致),这样你打印错误信息的时候

    会有一个__all__对象,这个就是你设置的全局钩子生成的。

    所以还要单独判断一下,现在全局钩子只有一个,你可以这样判断,但是,当全局钩子多的时候就得一个一个分开来判断

      if (i=="__all__"){
            $("#id_password_again").after($span)
       }

    二、具体实现注册操作

    urls.py 

     1 from django.conf.urls import url
     2 from django.contrib import admin
     3 from app01 import views
     4 from django.conf import settings
     5 from django.views.static import serve
     6 urlpatterns = [
     7     url(r'^admin/', admin.site.urls),
     8     url(r'^login/$', views.login),
     9     url(r'^index/$', views.index),
    10     url(r'^get_vaildCode_img/$', views.get_vaildCode_img),
    11     url(r'^log_out/$', views.log_out),
    12 
    13     url(r'^register/$', views.register),
    14     url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
    15 ]
    urls.py

    views.py

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from blog import models
    
    import json
    
    def login(reqeust):
        if reqeust.is_ajax():
    
           res={"user":None,"msg":None}
           user=reqeust.POST.get("user")
           pwd=reqeust.POST.get("pwd")
           valid=reqeust.POST.get("valid")
           print(reqeust.POST)
           random_str=reqeust.session.get("random_str")
           if valid.upper()==random_str.upper():
    
               from django.contrib import auth
    
               user=auth.authenticate(username=user,password=pwd)
               if user:
                   res["user"]=user.username
               else:
                   res["msg"]="用户名或者密码错误"
           else:
               res["msg"]="验证码失败"
    
           return HttpResponse(json.dumps(res))
    
    
    
        return render(reqeust,"login.html")
    
    
    def valid_img(request):
    
        # 方式1:
        # with open("egon.jpg","rb") as f:
        #     data=f.read()
    
        # 方式2:
        import random
        def get_random_color():
            return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
        # from PIL import Image
        # image=Image.new("RGB",(250,36),color=get_random_color())
        # f=open("validcode.png","wb")
        # image.save(f,"png")
        #
        # with open("validcode.png","rb") as f:
        #     data=f.read()
    
        # 方式3:
        # from PIL import Image
        # from io import BytesIO
        # image=Image.new("RGB",(250,36),color=get_random_color())
        # f=BytesIO()
        # image.save(f,"png")
        # data=f.getvalue()
    
        # 方式4:
        from PIL import Image
    
        from PIL import ImageDraw,ImageFont
        from io import BytesIO
        image=Image.new("RGB",(250,36),color=get_random_color())
    
        draw=ImageDraw.Draw(image)
        font = ImageFont.truetype("blog/static/font/kumo.ttf", size=32)
    
    
        random_str=""
        for i in range(5):
            random_num=str(random.randint(0,9))
            random_low_alpha=chr(random.randint(97,122))
            random_up_alpha=chr(random.randint(65,90))
            random_char=random.choice([random_num,random_low_alpha,random_up_alpha])
            draw.text((20+i*40,0),random_char,get_random_color(),font=font)
            random_str+=random_char
    
        print(random_str)
    
    
    
        request.session["random_str"]=random_str
    
    
    
    
    
    
    
        # 噪点噪线
        # width=250
        # height=36
        # for i in range(10):
        #     x1=random.randint(0,width)
        #     x2=random.randint(0,width)
        #     y1=random.randint(0,height)
        #     y2=random.randint(0,height)
        #     draw.line((x1,y1,x2,y2),fill=get_random_color())
        #
        # for i in range(100):
        #     draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
        #     x = random.randint(0, width)
        #     y = random.randint(0, height)
        #     draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())
        f=BytesIO()
        image.save(f,"png")
        data=f.getvalue()
        return HttpResponse(data)
    
    
    from django import forms
    class UserForm(forms.Form):
        user=forms.CharField(min_length=3)
        pwd=forms.CharField()
        repeat_pwd=forms.CharField()
        email=forms.EmailField()
    
    
        def clean_user(self):
            users=self.cleaned_data.get("user")
            user_info=models.UserInfo.objects.filter(username=users).first()
            if user_info:
                raise forms.ValidationError("用户已存在")
            else:
                return users
    
        def clean(self):
    
            print("clean",self.cleaned_data)
    
            if self.cleaned_data.get("pwd")!=self.cleaned_data.get("repeat_pwd"):
                raise forms.ValidationError("两次输入密码不一致,请重新输入")
            else:
                return self.cleaned_data.get("pwd")
    
    
    
    
    
    
    
    
    
    def reg(request):
        if request.method=="POST":
            form=UserForm(request.POST)
            res={"user":None,"msg":None}
            if form.is_valid():
                user=form.cleaned_data.get("user")
                pwd=form.cleaned_data.get("pwd")
                email=form.cleaned_data.get("email")
                avatar_img=request.FILES.get("avatar_img")
                cre_user=models.UserInfo.objects.create_user(username=user,password=pwd,email=email,avatar=avatar_img)
                res["user"]=form.cleaned_data.get("user")
            else:
                res["msg"]=form.errors
            return HttpResponse(json.dumps(res))
    
    
    
    
        return render(request,"reg.html")
    views

    template

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Blog</title>
        <link rel="stylesheet" href="/static/bs/css/bootstrap.min.css">
        <script src="/static/js/jquery-3.2.1.min.js"></script>
        <style>
            .error{
                color: red;
                margin-left: 20px;
            }
        </style>
    </head>
    <body>
    
    <h3>登录页面</h3>
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form enctype="application/x-www-form-urlencoded">
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="">用户名</label>
                        <input type="text" id="user" class="form-control">
                    </div>
                     <div class="form-group">
                        <label for="">密码</label>
                        <input type="password" id="pwd"  class="form-control">
                    </div>
    
                      <div class="form-group">
                        <label for="">验证码</label>
                          <div class="row">
                              <div class="col-md-6">
                                  <input type="text"id="valid"  class="form-control">
                              </div>
                              <div class="col-md-6">
                                  <img width="250" height="36" src="/valid_img/" alt="" class="valid_img">
                              </div>
                          </div>
    
                    </div>
                    <input type="button" value="登陆" class="login_btn btn btn-primary">
                    <a href="/reg/" class="pull-right">注册</a>
                    <span class="error"></span>
    
                </form>
            </div>
        </div>
    </div>
    
    
    
    <script>
         // 登录验证
         $(".login_btn").click(function () {
    
             $.ajax({
                 url:"",
                 data:{
                     user:$("#user").val(),
                     pwd:$("#pwd").val(),
                     valid:$("#valid").val(),
                     csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
                 },
                 type:"post",
                 success:function (data) {
                     console.log(data);
                     var data=JSON.parse(data);
                     if(data.user){
    
                     }else{
                       $(".error").html(data.msg)
    
                     }
                 }
             })
    
         });
    
        // 验证码局部刷新
    
        $(".valid_img").click(function () {
    
            $(this)[0].src+="?"
        })
    
    </script>
    
    </body>
    </html>
    login
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Blog</title>
        <link rel="stylesheet" href="/static/bs/css/bootstrap.min.css">
        <script src="/static/js/jquery-3.2.1.min.js"></script>
        <style>
            .error{
                color: red;
                margin-left: 20px;
            }
        </style>
    </head>
    <body>
    
    <h3>登录页面</h3>
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <form enctype="application/x-www-form-urlencoded">
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="">用户名</label>
                        <input type="text" id="user" class="form-control">
                    </div>
                     <div class="form-group">
                        <label for="">密码</label>
                        <input type="password" id="pwd"  class="form-control">
                    </div>
    
                      <div class="form-group">
                        <label for="">验证码</label>
                          <div class="row">
                              <div class="col-md-6">
                                  <input type="text"id="valid"  class="form-control">
                              </div>
                              <div class="col-md-6">
                                  <img width="250" height="36" src="/valid_img/" alt="" class="valid_img">
                              </div>
                          </div>
    
                    </div>
                    <input type="button" value="登陆" class="login_btn btn btn-primary">
                    <a href="/reg/" class="pull-right">注册</a>
                    <span class="error"></span>
    
                </form>
            </div>
        </div>
    </div>
    
    
    
    <script>
         // 登录验证
         $(".login_btn").click(function () {
    
             $.ajax({
                 url:"",
                 data:{
                     user:$("#user").val(),
                     pwd:$("#pwd").val(),
                     valid:$("#valid").val(),
                     csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
                 },
                 type:"post",
                 success:function (data) {
                     console.log(data);
                     var data=JSON.parse(data);
                     if(data.user){
    
                     }else{
                       $(".error").html(data.msg)
    
                     }
                 }
             })
    
         });
    
        // 验证码局部刷新
    
        $(".valid_img").click(function () {
    
            $(this)[0].src+="?"
        })
    
    </script>
    
    </body>
    </html>
    reg

     

    效果截图

     

     
     
     
  • 相关阅读:
    【win7】安装开发环境
    【php-fpm】启动PHP报错ERROR: [pool www] cannot get uid for user 'apache'
    【apache2】AH00543: httpd: bad user name apache
    【gedit】 显示行号
    关于golang.org/x包问题
    国内的go get问题的解决
    php7函数,声明,返回值等新特性介绍
    php5.6.x到php7.0.x特性
    PHP5.4.0新特性研究
    【git】如何去解决fatal: refusing to merge unrelated histories
  • 原文地址:https://www.cnblogs.com/yinxin/p/9045625.html
Copyright © 2011-2022 走看看