zoukankan      html  css  js  c++  java
  • BBS-基于forms组件和ajax实现注册功能

    http://www.cnblogs.com/yuanchenqi/articles/7638956.html

    1、设计注册页面

    views.py

    from django import forms
    
    class UserForm(forms.Form):
        user=forms.CharField(max_length=32)
        pwd=forms.CharField(max_length=32)
        re_pwd=forms.CharField(max_length=32)
        email=forms.EmailField(max_length=32)
    
    def register(request):
        # 实例化 form 对象
        form=UserForm()
        return render(request,'register.html',locals())

    运行后样式不好看,需要加样式

    增加 django.forms import widgets

    继续修改名字

    博客注册压面头像功能

    1、点击头像相当于点击上传文件input标签

     把用户名密码登陆框业设计成这种模式,更有利于交互

     ------

    隐藏上传文件的input标签

    效果图:

     

    2、头像预览功能

    (1)获取文件对象,(2)获取文件对象的路径,(3)修改img的src属性,src=文件对象的路径

    img绑定一个change事件

     

    views.py

    # 注册功能
    from django import forms
    
    from django.forms import  widgets
    class UserForm(forms.Form):
        user=forms.CharField(max_length=32,widget=widgets.TextInput(attrs={'class':'form-control'}),
                             label='用户名')
        pwd=forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),
                            label='密码')
        re_pwd=forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),
                               label='确认密码')
        email=forms.EmailField(max_length=32,widget=widgets.EmailInput(attrs={'class':'form-control'}),
                               label='邮箱')
    
    def register(request):
        # 实例化 form 对象
        form=UserForm()
        return render(request,'register.html',locals())

    模板层

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/blog/bootstrap-3.3.7/css/bootstrap.css">
    
        <style type="text/css">
            #avatar{display: none}
            #avatar_img{margin-left: 20px}
        </style>
    </head>
    <body>
    
    
    
       <div class="container">
           <div class="row">
           <h3>注册页面</h3>
               <div class="col-md-6 col-md-offset-3">
                   <form>
                       {% csrf_token %}
                       {% for field in form %}
                           <div class="form-group">
                               <label for="{{ field.auto_id }}">{{ field.label }}</label>
                               {{ field }} <span class="error pull-right"></span>
                           </div>
                       {% endfor %}
    {#                    上传头像功能#}
                       <div class="form-group">
                           <label for="avatar">
                               头像
                               <img id="avatar_img" width="60" height="60" src="/static/img/default.png" alt="">
                           </label>
                           <input type="file" id="avatar" name="avatar" >
                       </div>
                       <div class="form-group">
                           <div class="row">
                               <a href="/register/" class="btn btn-success pull-right">注册</a>
                           </div>
                       </div>
    
                   </form>
                </div>
           </div>
    
       </div>
    
    <script type="text/javascript" src="/static/JS/jquery-3.2.1.min.js"></script>
    
    <script type="text/javascript">
    
    
    $('#avatar').change(function () {
        // 1 获取用户选中的文件对象
        var file_obj=$(this)[0].files[0];
    
        // 2 获取文件路径
        var reader= new FileReader();
    
        reader.readAsDataURL(file_obj);
        // 3 修改img的src属性,src=文件对象的路径
    
        // 等图片文档加载完后才执行,,等上一步读完才执行
        reader.onload=function(){
             $('#avatar_img').attr('src',reader.result)
        }
    
    })
    </script>
    
    
    </body>
    
    
    </html>
    View Code

    Ajax提交formdata数据

    (1)点击注册按钮--FormData 对象的使用:

    FormData 对象的使用:
    1.用一些键值对来模拟一系列表单控件:即把form中所有表单元素的name与value组装成
    一个queryString
    2. 异步上传二进制文件。

    Django之JsonResponse

    https://www.cnblogs.com/guoyunlong666/p/9099397.html

     

    register

      // Ajax提交数据
        $('.reg_btn').click(function () {
            var formdata=new FormData();
            formdata.append('user',$('#id_user').val());
            formdata.append('pwd',$('#id_pwd').val());
            formdata.append('re_pwd',$('#id_re_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',
                contentType:false,
                processData:false,
                data:formdata,
                success:function (data) {
                    console.log(data)
    
                }
            })
        })

    试图函数

    def register(request):
        # 实例化 form 对象
    
        if request.is_ajax():
            print(request.POST)
            # 对传来的数据进行验证
            form = UserForm(request.POST)
            response={'user':None,'msg':None}
            if form.is_valid():
                #注册成功要把数据添加进数据库
                response['user']=form.cleaned_data.get('user')
            else:
                print(form.cleaned_data)
                print(form.errors)
                response['msg']=form.errors
            return JsonResponse(response)
        form=UserForm()
        return render(request,'register.html',locals())

    formdata上传数据优化

     // 基于Ajax提交数据
    
        $(".reg_btn").click(function () {
            //console.log($("#form").serializeArray());
            var formdata = new FormData();
            var request_data = $("#form").serializeArray();
            $.each(request_data, function (index, data) {
                formdata.append(data.name, data.value)
            });
         # 把特殊的单独拿出来写
            formdata.append("avatar", $("#avatar")[0].files[0]);

    注册时展示错误信息---ajax的success做判断

    效果一、没有填写信息按提交,现实提示错误

            $.ajax({
                url:'',
                type:'post',
                contentType:false,
                processData:false,
                data:formdata,
                success:function (data) {
                    console.log(data);
    
                    if(data.user){
                        // 注册成功
                    }
                    else {
                        $.each(data.msg,function (filed,error_list) {
                            console.log(filed,error_list);
                            //jQuery next() 获得匹配元素集合中每个元素紧邻的同胞元素。
                            $("#id_"+filed).next().html(error_list[0])
                        })
                    }
                }
            })

     效果改进

    输入信息后,提交,之前的错误提醒消失

    展示错误标签--添加class='has-error',错误的出现红框

    forms组件的局部钩子,全局钩子

     代码解耦--将UserForm

    把UserForm代码放入到Myforms.py模块中

    在原来的views.py中引入模块

    from blog.Myforms import UserForm

     class UserForm(forms.Form):封装了很多函数用来检验form表单输入的值

     

    Myforms.py

    from django import forms
    from django.forms import  widgets
    from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
    from blog.models import UserInfo
    
    
    class UserForm(forms.Form):
        user=forms.CharField(max_length=32,error_messages={'required':'该字段不能为空'},
                             widget=widgets.TextInput(attrs={'class':'form-control'}),
                             label='用户名')
        pwd=forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),
                            label='密码')
        re_pwd=forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),
                               label='确认密码')
        email=forms.EmailField(max_length=32,widget=widgets.EmailInput(attrs={'class':'form-control'}),
                               label='邮箱')
    
        def clean_user(self):
            val = self.cleaned_data.get("user")
    
            user = UserInfo.objects.filter(username=val).first()
            if not user:
                return val
            else:
                raise ValidationError("该用户已注册!")
    
        def clean(self):
            pwd=self.cleaned_data.get('pwd')
            re_pwd=self.cleaned_data.get('re_pwd')
            if pwd==re_pwd:
                return self.cleaned_data
            else:
                raise ValidationError('两次密码不一致')
    Myforms

    register.html错误中加一个显示密码不一致的信息

     $.each(data.msg,function (field,error_list) {
                            console.log(field,error_list);
                            // 全局错误在视图中取出来
                            if (field=='__all__'){
                                $('#id_re_pwd').next().html(error_list[0]).parent().addClass("has-error");
    
                            }

     上面全局钩子存在bug如果只写密码,不写确认密码也出现两次密码不一致

    改进:加个 判断 

    注册成功,添加数据

     register模板层 跳转到view视图

       
    注册成功跳转到登录页面

    if(data.user){ // 注册成功 location.href="/login/" }

    ---

    def register(request):
        # 实例化 form 对象
        if request.is_ajax():
            print(request.POST)
            # 对传来的数据进行验证
            form = UserForm(request.POST)
            response={'user':None,'msg':None}
            if form.is_valid():
                response['user'] = form.cleaned_data.get('user')
                #注册成功要把数据添加进数据库
                # 生成一条用户记录
                user=form.cleaned_data.get('user')
                pwd=form.cleaned_data.get('pwd')
                email=form.cleaned_data.get('email')
                avatar_obj=request.FILES.get('avatar')
                # 创建数据到数据库
                user_obj = UserInfo.objects.create_user(username=user, password=pwd, email=email, avatar=avatar_obj)
            else:
                print(form.cleaned_data)
                print(form.errors)
                response['msg']=form.errors
    # 返回给Ajax return JsonResponse(response) form=UserForm() return render(request,'register.html',locals())

    FieldFile字段

     

    # 4 FileField与ImageFiled
    区别是:
    fileField是可以任何文件
    ImageFile只能是图片文件
    avatar_obj=request.FILES.get('avatar')
    user_obj = UserInfo.objects.create_user(username=user, password=pwd, email=email, avatar=avatar_obj)
    写上这两行代码

    Django 会将文件对象下载到项目的根目录中avatars文件夹中(如果没有avatar文件夹,Django会自动创建),user_obj的avatar存的是文件的相对路径。

    media配置

    在主目录下创建media

    Dajngo有两种静态文件:
     
         /static/    :  js,css,img
         /media/      :   用户上传文件

    settings配置

    # MEDIA配置:与用户上传相关的配置
    # 配置1:用户上传头像的文件
    MEDIA_ROOT = os.path.join(BASE_DIR, "media")
    
    
    # 配置2:开放media目录给用户
    MEDIA_URL = "/media/"

     解决一个小问题当用户没有上传图片:

    def register

    avatar_obj=request.FILES.get('avatar') if avatar_obj: user_obj = UserInfo.objects.create_user(username=user, password=pwd, email=email, avatar=avatar_obj) else: user_obj = UserInfo.objects.create_user(username=user, password=pwd, email=email)

    没有上传就用默认的头像

    开放media目录给用户

     在路由下配置

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

    settings.py

    MEDIA_URL = "/media/"
    MEDIA_ROOT=os.path.join(BASE_DIR,'media')

    代码优化:

    代码规范:

    完整代码:

    urls

    """cnblog URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.1/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path,re_path
    from django.views.static import serve
    from cnblog import settings
    
    from blog import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        path('index/', views.index),
        path('register/', views.register),
        path('get_validCode_img/', views.get_validCode_img),
        re_path(r'media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT})
    ]
    url
    from django.shortcuts import render
    
    # Create your views here.
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    # 用户认证模块
    from django.contrib import auth
    from django.http import JsonResponse
    from blog.Myforms import UserForm
    from blog.models import UserInfo
    def login(request):
        if request.method=='POST':
            response={'user':None,'msg':None}
            user=request.POST.get('user')
            pwd=request.POST.get('pwd')
            # 读取验证码
            valid_code=request.POST.get('valid_code')
            # 回话跟踪技术,保存验证码
            valid_code_str=request.session.get('valid_code_str')
            # 如果书写的验证码和生成的验证码一致
            # 不区分大小写---可以统一变成大写
            if valid_code.upper()==valid_code_str.upper():
                user=auth.authenticate(username=user,password=pwd)
                if user:
                    auth.login(request,user)# request.user==当前登录对象
                    response['user']=user.username
                else:
                    response['msg']='username or password error'
            else:
                response['msg']='valid code error!'
            return JsonResponse(response)
        # ajax返回一个响应字符串
        return render(request,'login.html')
    
    
    def get_validCode_img(request):
    
    
        from blog.utils.validCode import  get_valid_Code_img
    
        data=get_valid_Code_img(request)
        return HttpResponse(data)
    
    
    
    def index(request):
    
        return render(request,'index.html',locals())
    
    
    def register(request):
        # 实例化 form 对象
    
        if request.is_ajax():
            print(request.POST)
            # 对传来的数据进行验证
            form = UserForm(request.POST)
            response={'user':None,'msg':None}
            if form.is_valid():
                response['user'] = form.cleaned_data.get('user')
                #注册成功要把数据添加进数据库
                # 生成一条用户记录
                user=form.cleaned_data.get('user')
                pwd=form.cleaned_data.get('pwd')
                email=form.cleaned_data.get('email')
                avatar_obj=request.FILES.get('avatar')
                if avatar_obj:
                    user_obj = UserInfo.objects.create_user(username=user, password=pwd, email=email, avatar=avatar_obj)
                else:
                    user_obj = UserInfo.objects.create_user(username=user, password=pwd, email=email)
    
    
    
            else:
                print(form.cleaned_data)
                print(form.errors)
                response['msg']=form.errors
                # 返回给Ajax
            return JsonResponse(response)
        form=UserForm()
        return render(request,'register.html',locals())
    View
    from django.db import models
    
    # Create your models here.
    from django.contrib.auth.models import User, AbstractUser
    
    
    class UserInfo(AbstractUser):
        """
        用户信息
        """
        nid = models.AutoField(primary_key=True)
        telephone = models.CharField(max_length=11, null=True, unique=True)
        avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png")
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
        blog = models.OneToOneField(to='Blog', to_field='nid', null=True, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.username
    
    
    class Blog(models.Model):
        """
        博客信息表(站点表)
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='个人博客标题', max_length=64)
        site_name = models.CharField(verbose_name='站点名称', max_length=64)
        theme = models.CharField(verbose_name='博客主题', max_length=32)
    
        def __str__(self):
            return self.title
    
    
    class Category(models.Model):
        """
        博主个人文章分类表
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='分类标题', max_length=32)
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)
    
        def __str__(self):
            return self.title
    
    
    class Tag(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField(verbose_name='标签名称', max_length=32)
        blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)
    
        def __str__(self):
            return self.title
    
    
    class Article(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=50, verbose_name='文章标题')
        desc = models.CharField(max_length=255, verbose_name='文章描述')
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
        content = models.TextField()
    
        comment_count = models.IntegerField(default=0)
        up_count = models.IntegerField(default=0)
        down_count = models.IntegerField(default=0)
    
        user = models.ForeignKey(verbose_name='作者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
        category = models.ForeignKey(to='Category', to_field='nid', null=True, on_delete=models.CASCADE)
        tags = models.ManyToManyField(
            to="Tag",
            through='Article2Tag',
            through_fields=('article', 'tag'),
        )
    
        def __str__(self):
            return self.title
    
    
    class Article2Tag(models.Model):
        nid = models.AutoField(primary_key=True)
        article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid', on_delete=models.CASCADE)
        tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid', on_delete=models.CASCADE)
    
        class Meta:
            unique_together = [
                ('article', 'tag'),
            ]
    
        def __str__(self):
            v = self.article.title + "---" + self.tag.title
            return v
    
    
    class ArticleUpDown(models.Model):
        """
        点赞表
        """
    
        nid = models.AutoField(primary_key=True)
        user = models.ForeignKey('UserInfo', null=True, on_delete=models.CASCADE)
        article = models.ForeignKey("Article", null=True, on_delete=models.CASCADE)
        is_up = models.BooleanField(default=True)
    
        class Meta:
            unique_together = [
                ('article', 'user'),
            ]
    
    
    class Comment(models.Model):
        """
    
        评论表
    
        """
        nid = models.AutoField(primary_key=True)
        user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
        article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid', on_delete=models.CASCADE)
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
        content = models.CharField(verbose_name='评论内容', max_length=255)
    
        parent_comment = models.ForeignKey("self", null=True, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.content
    models
    # 注册功能
    from django import forms
    from django.forms import  widgets
    from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
    from blog.models import UserInfo
    
    
    class UserForm(forms.Form):
        user=forms.CharField(max_length=32,error_messages={'required':'该字段不能为空'},
                             widget=widgets.TextInput(attrs={'class':'form-control'}),
                             label='用户名')
        pwd=forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),
                            label='密码')
        re_pwd=forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),
                               label='确认密码')
        email=forms.EmailField(max_length=32,widget=widgets.EmailInput(attrs={'class':'form-control'}),
                               label='邮箱')
    
        def clean_user(self):
            val = self.cleaned_data.get("user")
    
            user = UserInfo.objects.filter(username=val).first()
            if not user:
                return val
            else:
                raise ValidationError("该用户已注册!")
    
        def clean(self):
            pwd=self.cleaned_data.get('pwd')
            re_pwd=self.cleaned_data.get('re_pwd')
            if pwd and re_pwd:
                if pwd==re_pwd:
                    return self.cleaned_data
                else:
                    raise ValidationError('两次密码不一致')
            else:
                return self.cleaned_data
    Myform
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/blog/bootstrap-3.3.7/css/bootstrap.css">
    
    
    </head>
    <body>
    
    
    
       <div class="container">
           <div class="row">
               <div class="col-md-6 col-md-offset-3">
                   <form>
                       {% csrf_token %}
    
                           <h3 class="col-md-offset-5">登录页面</h3>
                           <div class="form-group   ">
                               <label for="username">username</label>
                               <input type="text" class="form-control " placeholder="username" id="username">
                           </div>
                           <div class="form-group ">
                               <label for="password">Password</label>
                               <input type="password" class="form-control " id="password" placeholder="Password">
                           </div>
                            <div class="form-group">
                                <label for="id_valid_code_str">验证码</label>
                                <div class="row ">
                                    <div class="col-md-6">
                                        <input type="text" id="id_valid_code_str" class="form-control">
                                    </div>
                                    <div class="col-md-6">
                                        <img src="/get_validCode_img/"  id="id_valid_code_img" width="270" height="34" title="验证码" alt="">
                                    </div>
                                </div>
                             </div>
                           <div class="form-group">
                               <div class="row">
                                   <div class="col-md-6">
                                       <input type="button" class="btn btn-default login-btn pull-left" value="登录"><span
                                           class="error"></span>
                                   </div>
                                   <div class="col-md-6">
                                       <a href="/register/" class="btn btn-success pull-right">注册</a>
                                   </div>
                               </div>
                           </div>
                   </form>
                </div>
           </div>
    
       </div>
    
    <script type="text/javascript" src="/static/JS/jquery-3.2.1.min.js"></script>
    
    <script type="text/javascript">
      //刷新验证码
        $(function () {
            $("#id_valid_code_img").click(function () {
                $(this)[0].src+="?"
            })
        });
    
    
        // 登录验证
        $('.login-btn').click(function () {
            $.ajax(
                {
                    url:'',
                   type:'post',
                   data:{user:$('#username').val(),pwd:$('#password').val(),valid_code:$('#id_valid_code_str').val(),
    {#                   {% csrf_token %}#}
                   csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()},
    
                    success:function (data) {
                        console.log(data);
                        if(data.user){
                            location.href='/index'
                        }
                        else {
                            $('.error').text(data.msg).css({'color':'red','margin-left':'10px'})
                            setTimeout(function () {
                                $('.error').text('')
                            },1000)
                        }
                    }
                })
    
        })
    </script>
    
    
    </body>
    
    
    </html>
    login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/blog/bootstrap-3.3.7/css/bootstrap.css">
    
        <style type="text/css">
            #avatar{display: none}
            #avatar_img{margin-left: 20px}
             .error {
                color: red;
            }
        </style>
    </head>
    <body>
    
    
    
       <div class="container">
           <div class="row">
           <h3>注册页面</h3>
               <div class="col-md-6 col-md-offset-3">
                   <form id="form">
                       {% csrf_token %}
                       {% for field in form %}
                           <div class="form-group">
                               <label for="{{ field.auto_id }}">{{ field.label }}</label>
                               {{ field }} <span class="error pull-right"></span>
                           </div>
                       {% endfor %}
    {#                    上传头像功能#}
                       <div class="form-group">
                           <label for="avatar">
                               头像
                               <img id="avatar_img" width="60" height="60" src="/static/img/default.png" alt="">
                           </label>
                           <input type="file" id="avatar" name="avatar" >
                       </div>
                       <div class="form-group">
                           <div class="row">
                               <input type="button" class="btn btn-default reg_btn" value="submit"><span class="error"></span>
    
                           </div>
                       </div>
                   </form>
                </div>
           </div>
       </div>
    
    <script type="text/javascript" src="/static/JS/jquery-3.2.1.min.js"></script>
    
    <script type="text/javascript">
    
    
    $('#avatar').change(function () {
        // 1 获取用户选中的文件对象
        var file_obj=$(this)[0].files[0];
    
        // 2 获取文件路径
        var reader= new FileReader();
    
        reader.readAsDataURL(file_obj);
        // 3 修改img的src属性,src=文件对象的路径
    
        // 等图片文档加载完后才执行,,等上一步读完才执行
        reader.onload=function(){
             $('#avatar_img').attr('src',reader.result)
        }
    });
    
        // Ajax提交数据
        {#$('.reg_btn').click(function () {#}
        {#    var formdata=new FormData();#}
        {#    formdata.append('user',$('#id_user').val());#}
        {#    formdata.append('pwd',$('#id_pwd').val());#}
        {#    formdata.append('re_pwd',$('#id_re_pwd').val());#}
        {#    formdata.append('email',$('#id_email').val());#}
        {#    formdata.append('avatar',$('#avatar')[0].files[0]);#}
        {#    formdata.append('csrfmiddlewaretoken',$("[name='csrfmiddlewaretoken']").val());#}
     // 基于Ajax提交数据
    
        $(".reg_btn").click(function () {
            //console.log($("#form").serializeArray());
            var formdata = new FormData();
            var request_data = $("#form").serializeArray();
            $.each(request_data, function (index, data) {
                formdata.append(data.name, data.value)
            });
    
            formdata.append("avatar", $("#avatar")[0].files[0]);
    
            $.ajax({
                url:'',
                type:'post',
                contentType:false,
                processData:false,
                data:formdata,
                success:function (data) {
                    console.log(data);
    
                    if(data.user){
                        // 注册成功
                        location.href="/login/"
                    }
                    else {
                         //console.log(data.msg)
                        // 清空错误信息---先清空所有--移除所有样式
                        $("span.error").html("");
                        $(".form-group").removeClass("has-error");
                        // 再把含有错误的标签 赋值,加样式--达到相应的效果
                        $.each(data.msg,function (field,error_list) {
                            console.log(field,error_list);
                            // 全局错误在视图中取出来
                            if (field=='__all__'){
                                $('#id_re_pwd').next().html(error_list[0]).parent().addClass("has-error");
    
                            }
    
    
                            //jQuery next() 获得匹配元素集合中每个元素紧邻的同胞元素。
                            $("#id_"+ field).next().html(error_list[0]);
                            $("#id_"+ field).parent().addClass("has-error");
                        })
                    }
                }
            })
        })
    
    </script>
    
    
    </body>
    
    
    </html>
    register.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {{ request.user}}
    <h3>this is my index</h3>
    </body>
    </html>
    index.html

    8、总结

    基于forms组件和Ajax实现注册功能
    
    
    # 1 基于forms组件设计注册页面
    
    
       ---点击头像===点击input
    
       ---头像预览:
          1 获取用户选中的文件对象
          2 获取文件对象的路径
          3 修改img的src属性 ,src=文件对象的路径
    
    # 2 错误信息:
       
       views:
    
           form.erorrs # {"user":[......]}
    
        Ajax.success:
           $.each(data.msg, function (field, error_list) {
                         
                            $("#id_" + field).next().html(error_list[0]);
                            $("#id_" + field).parent().addClass("has-error");
    
                        })
    
    # 3 局部钩子和全局钩子校验
       user字段不能重复
       两次密码不一致
    
    
    
    # 4 FileField与ImageFiled
    区别是:
    fileField是可以任何文件
    ImageFile只能是图片文件 class UserInfo(AbstractUser): nid = models.AutoField(primary_key=True) telephone = models.CharField(max_length=11, null=True, unique=True) avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png") avatar_obj=request.FILES.get("avatar") user_obj=UserInfo.objects.create_user(username=user,password=pwd,email=email,avatar=avatar_obj) Dajngo实现: 会将文件对象下载到项目的根目录中avatars文件夹中(如果没有avatar文件夹,Django会自动创建),user_obj的avatar存的是文件的相对路径。 # 5 Media 配置之MEDIA_ROOT: Dajngo有两种静态文件: /static/ : js,css,img /media/ : 用户上传文件 class UserInfo(AbstractUser): nid = models.AutoField(primary_key=True) telephone = models.CharField(max_length=11, null=True, unique=True) avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png") avatar_obj=request.FILES.get("avatar") user_obj=UserInfo.objects.create_user(username=user,password=pwd,email=email,avatar=avatar_obj) 一旦配置了 MEDIA_ROOT=os.path.join(BASE_DIR,"media") Dajngo实现: 会将文件对象下载到MEDIA_ROOT中avatars文件夹中(如果没有avatar文件夹,Django会自动创建),user_obj的avatar存的是文件的相对路径。 # 6 Media 配置之MEDIA_URl: 浏览器如何能直接访问到media中的数据 settings.py: MEDIA_URL="/media/" urls.pt: # media配置: re_path(r"media/(?P<path>.*)$",serve,{"document_root":settings.MEDIA_ROOT})
  • 相关阅读:
    自动以管理员身份运行批处理(bat)文件
    apache+php完美解决301重定向的两种方法
    Apache限制访问某目录或某文件,限制允许指定IP
    Apache 禁用IP 访问 和 HTTP 跳转 HTTPS
    301重定向代码合集(iis,asp,php,asp.net,apache)
    以太坊中的gas、gas price、gas limit到底是什么
    解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
    linux/kde下chrome浏览器缺失最小化,最大化按钮的解决方案
    python自动化--语言基础三字典、函数、全局/局部变量
    python自动化--语言基础二运算符、格式化输出、条件语句、循环语句、列表、元组
  • 原文地址:https://www.cnblogs.com/foremostxl/p/9993227.html
Copyright © 2011-2022 走看看