注册功能页面的搭建

思路分析

注册页面需要对用户提交的数据进行校验,并且需要对用户输入错误的地方进行提示!

所有我们需要使用forms组件搭建注册页面!

平时我们书写form是组件的时候是在views.py里面书写的,
但是为了接耦合,我们需要将forms组件都单独写在一个地方,需要用的时候导入就行!

例如,在项目文件夹下创建一个myforms文件夹,里面放各种forms组件文件:

	myforms文件夹
		regform.py
		loginform.py
		userform.py
		orderform.py

注册页面的效果图:
image

注册页面代码实现

1.编写注册页面的forms组件

from django import forms
from app01 import models


class RegisterForms(forms.Form):
    username = forms.CharField(label='用户名',max_length=8,min_length=3,error_messages={
        'required':'用户名不能为空',
        'max_length':'用户名最大8位',
        'min_length': '用户名最小8位',
    },
     widget= forms.widgets.TextInput(attrs={'class':'form-control'}),
   )

    password = forms.CharField(label='密码',max_length=8,min_length=3,error_messages={
        'required':'密码不能为空',
        'max_length':'密码最大8位',
        'min_length': '密码最小8位',
    },
     widget= forms.widgets.PasswordInput(attrs={'class':'form-control'}),
   )
    confirm_password = forms.CharField(label='确认密码', max_length=8, min_length=3, error_messages={
        'required': '确认密码不能为空',
        'max_length': '确认密码最大8位',
        'min_length': '确认密码最小8位',
    },
    widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}),
    )
    email = forms.EmailField(label='邮箱',error_messages={
        'required':'邮箱不能为空',
        'invalid':'邮箱格式不正确',
    },
    widget=forms.widgets.EmailInput(attrs={'class':'form-control'})
                            )

    # 钩子函数
    def clean_username(self):
        username = self.cleaned_data.get('username')
        is_exist = models.UserInfo.objects.filter(username=username)
        if is_exist:
            self.add_error('username','该用户名已存在')
        return username

    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if password != confirm_password:
            self.add_error('confirm_password','两次密码不一致')
        return self.cleaned_data

2.将注册页面的forms组件传入views.py里,然后渲染到前端页面

from app01.myforms import RegisterForms
def register(request):
    form_obj = RegisterForms() # 生产一个空的form_obj对象,然后传入前端就可以渲染出html页面
    return render(request,'register.html',locals())

3.forms组件在前端渲染的第三种方式

<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h3 class="text-center">注册</h3>
            <form id="myform">  <!--注意这里不用form表单提交数据,用form标签只是为了后面的序列化表单分便取出数据-->
            {% csrf_token %}
                {% for form in form_obj %}
                    <div class="form-group">
					
                        <label for="{{ form.auto_id }}">{{ form.label }}:</label>
                        {{ form }}
                        <span style="color: red">{{ form.error.0 }}</span>
                    </div>
                {% endfor %}
                <div class="form-group">
                    <label for="myfile">头像: &nbsp;<img src="/static/img/default.png" alt="" width="100px">
                    </label>
                    <input type="file" id="myfile" style="display: none">
                </div>
                <input type="button" class="btn btn-primary pull-right" value="提交" id="id_commit">
            </form>
        </div>
    </div>
</div>

4.用户头像动态展示:用到的是一个图片阅读器对象

    // 用户头像动态展示:给头像文件框绑定一个文本域变化事件,当文本域变化时动态展示图片
    $('#myfile').change(function (){
        // 1.先生成一个文件阅读器对象,用于读取头像和存储头像
        let fileReaderObj = new FileReader();
        // 2.获取头像对象
        let fileObj = $('#myfile')[0].files[0];
        // 3.利用文件阅读器对象读取头像
        // 注意:这一步是异步操作,也是IO操作,意味着我还没有读取完毕就往下执行了,所以fileReaderObj.result没有任何结果,因此需要使用预加载,等第3步执行完毕在执行第4步
        fileReaderObj.readAsDataURL(fileObj);
        // 4.利用文件阅读器对象将头像展示到前端页面  即:修改img标签里的src属性
        fileReaderObj.onload = function (){
            $('#myimg').attr('src',fileReaderObj.result)
        };
    })

5.向后端提交用户数据:用到了表单序列化方法取到用户数据和jquery查找方法,得到对应input的id值渲染文本和样式

    // 向后端提交用户数据
    $('#id_commit').click(function (){
        let formData = new FormData();
        let formDataObj = $('#myform').serializeArray();
        $.each(formDataObj,function (index,obj){
            formData.append(obj.name,obj.value)
        });
        formData.append('file',$('#myfile')[0].files[0]);
        $.ajax({
            type:'post',
            url:'',
            data:formData,
            contentType:false,
            processData:false,
            success:function (args){
                if (args.code==1000){
                    window.location.href = args.url
                }else{
                    // 找到对应span标签,渲染上错误信息
                    // 先来看下错误信息的格式和对应input标签的id
                    $.each(args.msg,function (index,obj){
                        // index是对应的字段名,obj是对应的错误信息列表
                        // 得到目标的input的id值
                        let targetID = '#id_' + index;
                        $(targetID).next().text(obj[0]).parent().addClass('has-error')
                    })
                }
            }
        })
    })

6.聚焦事件:当鼠标聚焦到对应input框时,取消对应标签的文本和样式

    // 当鼠标聚焦到input框时,取消input的has-error样式和错误提示文本
    $('input').focus(function (){
        $(this).next().text('').parent().removeClass('has-error')
    })

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:注册功能页面的搭建 - Python技术站

(0)
上一篇 2023年4月2日 下午4:48
下一篇 2023年4月2日 下午4:48

相关文章

  • django中操作mysql数据库

    1.准备工作(django连接数据库) 1.本机电脑下载好mysql数据库2.打开django,修改setting.py中的DATABASES配置项 DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘python’, ‘USER’: ‘root’, ‘PASSW…

    2023年4月2日
    00
  • 将侧边栏制成inclusion_tag

    在开发过程中,像侧边栏这种功能的版块,我们在很多页面都需要使用到的时候,我们则需要在视图函数中书写重复的代码,这样很繁琐,我们可以将侧边栏制成inclusion_tag,后面我们需要用到侧边栏功能时,只需要导入即可! 将侧边栏制成inclusion_tag的步骤: 1.在应用下创建一个名字必须叫templatetags的文件夹 2.在该文件夹内,创建一个任意…

    2023年4月2日
    00
  • input与print语法

    1.input输入语法 input是用来接收用户输入的一种语法,实现计算机与用户之间的交互,改方法有一个返回值,返回的是用户输入的字符串! 语法:res = input(‘请输入您的账号:’) 在python3中,用户输入的数据类型将会被全部转成字符串类型。在python2中,用户输入什么数据类型,程序就会转成什么类型,指的注意的是,用户假如输入的数据类型错…

    Python开发 2023年4月2日
    00
  • cpu详解

    1.cpu的指令集和分类 1.1cpu的指令集 cpu的指令集指的是:控制计算机硬件的一系列命令。 指令集可以分为: 1.精简指令集:更短、更稳定,每条指令集运行的时间更短2.复杂指令集:可以完成更复杂的功能。需要花费的时间更长 1.2cpu的分类 cpu按照指令集可以分为:精简指令集cpu和复杂指令集cpu 2.x86-64位的概念 x86针对的是cpu的…

    2023年4月2日
    00
  • 过滤组件、排序组件、全局异常处理、自己封装的response对象

    过滤组件 查询所有才涉及到过滤,其他接口都不需要restful规范中有一条,请求地址中带过滤条件:分页、排序、过滤统称为过滤 内置过滤类 使用内置过滤类的步骤 from rest_framework.filters import OrderingFilter,SearchFilter 必须是继承GenericAPIView+ListModelMixin的之类…

    2023年4月2日
    00
  • 面向对象介绍

    1.什么是面向对象和面向过程编程思想 面向过程: 1.核心是‘过程’二字2.过程的含义是将程序流程化3.过程是流水线,用来分步骤解决问题的 程序=数据+功能 面向对象: 1.核心是‘对象’二字2.对象的含义是将程序进行整合3.对象是‘容器’,用来盛放数据和功能(变量和函数) 总结:以做西红柿鸡蛋面为例: 面向过程:我需要买西红柿–》买鸡蛋、面–》把西红柿…

    2023年4月2日
    00
  • 迭代器与生成器

    1.什么是迭代器 迭代器是用来迭代取值的工具,而迭代的意思是一个重复的过程,每一次的重复都是基于上一次的结果继续的,单纯的重复并不是迭代 2.为何要有迭代器 在python中涉及到需要把多个值循环取出来的类型有:字符串、列表、元组、字典、集合、打开文件等,我们可以考虑使用while循环的方式来循环取出多个值,例如: list=[‘egon’,’lin’,11…

    Python开发 2023年4月2日
    00
  • 基础数据类型之元组

    1.元组的定义 元组,其实就是一个不可变的‘列表’ 用小括号()定义,括号内用逗号分隔开任意类型的数据,当只有一个数据时也需要加逗号 元组中的数据是不可改变指的是:数据的内存地址不可改变,如果元组里是列表(可变类型),可以通过方法往列表里增删值!!! 2.元组的作用 按照索引/位置存放多个数据,这些数据只用于读,不用于改 3.类型转换 tuple()方法转换…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部