1. 在app下 新建 forms.py

定义表单内容,类型models

from django import forms

class RegisterForm(forms.Form):
username = forms.CharField(label='用户名', max_length=20) # CharField 对应 html的 input type=text name= 前面的username ,label 对应lable
password = forms.CharField(label='密码',
max_length=12,
min_length=6,
widget=forms.PasswordInput(attrs={'placehodler': # 密码类型的 input
'请输入长度为6-12位的密码'}),
error_messages={ # 定义错误信息 和上面的属性对应.
'min_length': '密码长度小于6位',
'max_length': '密码长度大于12位'
})
password_repeat = forms.CharField(label='再次输入密码', widget=forms.PasswordInput())
email = forms.EmailField()

2. 定义视图,实例化form表单,传到前端

from teatcher.forms import RegisterForm   # 导入 自定义form 

def register(request):
if request.method == 'GET':
form = RegisterForm() # 实例化
return render(request, 'register.html',context={'form': form}) #传到前端

3. 新增url 及 前端 html模板

<body>
<form action="">
{% csrf_token %}
{{ form }} # 显示 表单 内容. form 和 submit 需要手动添加,不在form(只有字段) 范围内.
<input type="submit" value="提交">
</form>
</body>
<body>
<form action="" method='post'>
{{ form.as_p }} # form.as_p 每一行加 <o>标签
<input type="submit" value="提交">
</form>
</body>
# views.py
def register(request):
if request.method == 'GET':
form = RegisterForm()
#return render(request, 'register.html', context={'form': form}) if request.method=='POST':
form = RegisterForm(request.POST) # 从前端获得了数据, 填充了数据的form 实例
if form.is_valid(): # is_valid()自动判断是否满足 form 定义时的条件.true 验证成功
        return HttpRespone('注册成功')
  
   return render(request, 'register.html', context={'form': form})  #如果 上面的条件都不满足(中间没有return )执行这一条

#  上面的 is_valid 方法. 调用了 form.clean方法 验证 数据,默认不验证 二个输入密码的一致性.

在forms.py 中 重写 clean方法.继承父类的功能,增加新功能.
#  1定义form 表单, 2 在view 中注册 3.复写 clean 方法(验证信息)

from django import forms

class RegisterForm(forms.Form):
username = forms.CharField(label='用户名', max_length=20) # CharField 对应 html的 input type=text name= 前面的username ,label 对应lable
password = forms.CharField(label='密码',
max_length=12,
min_length=6,
widget=forms.PasswordInput(attrs={'placehodler': # 密码类型的 input
'请输入长度为6-12位的密码'}),
error_messages={ # 定义错误信息 和上面的属性对应.
'min_length': '密码长度小于6位',
'max_length': '密码长度大于12位'
})
password_repeat = forms.CharField(label='再次输入密码', widget=forms.PasswordInput())
email = forms.EmailField() def clean(self): # 复写父类的方法
# 调用 is_valid 方法的时候,就会去调用 clean方法
clean_data = super().clean() # 保证父类的 clean方法被执行.要这么写. 父类没有验证信息一致性的功能,以下为验证密码(变量名看上面的属性名)
password = clean_data.get('passwrod') # 父类 处理过的数据中 拿到 pssword 变量
password_repeat = clean_data.get('password_repeat') # 父类 处理过的数据中 拿到 password_repeat 变量
if password != password_repeat:
msg = '密码不一致'
self.add_error('password_repeat', msg) # 给属性加了一个 error信息.

Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)的更多相关文章

  1. Django框架form表单配合ajax注册

    总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 下面是写的登录页面的实例 1:views视图中的代码 # 注册页面 def regi ...

  2. django自带的用户认证和form表单功能

    一.用户认证 1.用户认证方法 1.ajango自带用户认证功能,只需要引入相应的模块就可以使用,但是前提是必须使用ajango自带的auth_user表,并且需要把用户相关信息存放在该表中. 2.引 ...

  3. 基于form表单 写登陆注册

    urls urlpatterns = [ url(r'^admin/', admin.site.urls), # 登录界面url(r'^login/$', views.login,name='logi ...

  4. django之表多对多建立方式、form组件、钩子函数 08

    目录 多对多三种创建方式 1.全自动(用ManyToManyField创建第三张表) 2.纯手写 3.半自动 form组件 引入 form组件的使用 forms组件渲染标签 form表单展示信息 fo ...

  5. form表单上传附件的几种方法

    问题描述:在网页开发过程中,当需要上传附件(图片,音频,视频等)时,常规方法是使用form表单进行提交,这里总结一下form表单提交的几种方法. 参考地址:http://www.cnblogs.com ...

  6. html5之table嵌入form表单布局(务必注意:table标签必须在form表单内部,不能再form表单外部!)

    切记:用table标签来布局form表单元素,table标签必须放在form表单内部,否则可能会出现各种bug 原文地址:https://blog.csdn.net/weixin_43343144/a ...

  7. django 增加验证邮箱功能

    在user文件夹下新建python包,utils 在包内新建文件email_send.py,其中包括验证字符串随机码的产生,数据库的存储和email的发送 # -*- coding: utf-8 -* ...

  8. form 表单onclick事件 禁止表单form提交

    最近遇到一次处理form数据的过滤,采用了button的onclick事件来检查,发现return false后表单仍然提交了. 于是仔细研究了下onclick.onsubmit.submit集合函数 ...

  9. form表单提交后结果乱码的解决方法

    1.产生乱码原因:表单提交使用的method="get",get方式数据都是通过地址栏传输,数据会以iso-8859-1方式传输,因此产生乱码 2.概念:URI: Uniform ...

随机推荐

  1. jQuery使用CDN加速

    使用新浪.百度.谷歌和微软的CDN加速jQuery 随着jQuery的版本更新,体积也越来越大,如果把jQuery放在自己的服务器上,会消耗不少的流量.而谷歌和百度等互联网公司为了方便开发者,提供了C ...

  2. PAT 乙级 1074 宇宙无敌加法器 (20 分)

    1074 宇宙无敌加法器 (20 分) 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”.每 ...

  3. vue 路由别名 路由跳转

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. mybatis与数据库访问相关的配置以及设计

    mybatis与数据库访问相关的配置以及设计 mybatis不管如何NB,总是要与数据库进行打交道.通过提问的方式,逐步深入 我们常用的MyBatis配置中哪些是与数据库相关? 数据源配置: < ...

  5. spring资源加载结构解析

    1.spring中资源加载使用resources的原因? 在java将不同资源抽象成url,然后通过注册不同的hander来处理不同读取逻辑,一般hander使用协议的前缀来命名,如http,jar, ...

  6. WordPress版微信小程序2.6版发布

    WordPress版微信小程序的完善和升级的工作一直都在进行中,我争取保证一个月可以出一个版本,希望通过一点点的改进,让这个开源产品日趋完美. 同时,pro版WordPress微信小程序也在紧锣密鼓的 ...

  7. VB 调用 webservice 出现:WSDLReader:Loading of the WSDL file failed HRESULT=0×80040154: 没有注册类别 解决方案

    有些 VB 程序在调用  webservice  的时候出现“WSDLReader:Loading of the WSDL file failed HRESULT=0×80040154: 没有注册类别 ...

  8. 问题-python3.6找不到tkinter

    问题:import tkinter失败 然后直接pip安装也不ok python3.6安装过程中会提示是否选择安装tkinter,如此只有打开原来的安装程序 勾选箭头所示

  9. sql获取时间段内的所有日期

    ,'2015-01-01 00:00:00') h INTO vinson_h DELETE vinson_h DECLARE @h int SELECT @h=DATEDIFF(HOUR,'2015 ...

  10. Javascript面向对象编程(二)

    子承父业 该方法利用了call,apply,按照原有的方式进行复制,做一些改进,最后进行事务处理.废话不多说,直接看例子. 在这里我提一下,call和apply的异同:它们两个都可以改变this指向, ...