一、forms组件--校验类的使用

二、form组件--校验类的参数

三、forms组件校验的局部钩子--自定义校验规则(要看源码理解)

四、forms组件校验的全局钩子--校验form表单两次密码输入是否一致

五、forms组件的渲染标签功能(推荐方式二)

一、forms组件--校验类的使用

1、校验字段功能(最核心功能)

示例1:
在服务端进行格式校验
-------这个写在一个新模块里-------------
from django import forms
class UserForm(forms.Form): #新建一个校验类
  name = forms.CharField(min_length) #必须为字符串,最小4位
  email = forms.EmailField() #邮箱校验

--------------------------------------------------

-------视图函数里的用户注册方法-------

def register(request):
    # 字典的键必须跟校验类里的字段一样
  form=UserForm({"name":"yuan","email":"123"})
    # 开始校验,所有校验类里的值校验通过返回True,否则返回False
    # 字典里有多少个无所谓,只要校验类里的字段通过就是True
  bool = form.is_valid()
    # cleaned_data 这里面放所有校验通过的键值
  form.cleaned_data
    # errors 这里面放所有未通过的键值 是仿字典类型
    # 例如name没通过,要取errors里的错误信息:form.errors["name"][0]
  form.errors

  return HttpResponse(request, "ok")

------------------------------------------------------

完整示例:

def register(request):
    #校验类字段要跟前端form表单一样
  form=UserForm(request.POST)
  if form.is_valid():
    clean = form.cleaned_data
  else:
    clean = form.cleaned_data
    errors = form.errors
-------------------------------------------------
总结:
1.注意前端form表单内的需要校验的属性名称,要跟后端校验类的字段一致
2. 掌握is_valid() 、 cleaned_data、 errors各自含义

二、form组件--校验类的参数

如果想改渲染的标签类型为password:widgets.PasswordInput
如果想改错误提示信息:error_messages参数
如果需要给渲染的标签加样式类, 就要加属性键值对,什么都行:widget=widgets.TextInput(attrs={"class":"form-control"})

from django.forms import widgets
class UserForm(forms.Form): 
  name = forms.CharField(min_length=4, label="用户名", error_messages={"required":"不能为空","invalid":"格式错误"})  #错误类型不能改其他名字
  pwd = forms.CharField(min_length=4, label="密码",widget=widgets.PasswordInput(attrs={"class":"form-control"})) 
  r_pwd = forms.CharField(min_length=4, label="确认密码") 
  email = forms.EmailField(label="邮箱",widget=widgets.TextInput(attrs={"class":"form-control"}))  # 给标签加属性
  tel = forms.CharField(label="电话")

三、forms组件校验的局部钩子--自定义校验规则(要看源码理解)

第二层校验:clean_xx方法,校验通过返回该值,否则抛ValidationError异常

------------------------------------------------------------------------------------

from django.core.exceptions import ValidationError
class UserForm(forms.Form): 
  name = forms.CharField(min_length=4, label="用户名")
  pwd = forms.CharField(min_length=4, label="密码") 
  r_pwd = forms.CharField(min_length=4, label="确认密码") 
  email = forms.EmailField(label="邮箱")
  tel = forms.CharField(label="电话")

  #该功能验证用户名是否已被注册
  def clean_name(self):
    name = self.cleaned_data.get("name")
    ret = UserInfo.objects.filter(name=name)
    if not ret:
      return name
    else:
      #只能抛这个错误类型
      raise ValidationError("该用户已注册")
----------------------------------------------------------------------------------------

四、forms组件校验的全局钩子--校验form表单两次密码输入是否一致

在校验类里,覆盖父类clean方法

获取全局钩子错误(在模板里渲染):form.errors.get("__all__")[0]

def clean():
  # 先从cleaned_data中取要联合校验的字段
  pwd=self.cleaned_data.get('pwd')
  r_pwd=self.cleaned_data.get('r_pwd')
  if pwd and r_pwd:
    # pwd跟r_pwd之前的校验已通过,才验证全局钩子
    if pwd==r_pwd:
        # 这里面包括pwd和r_pwd
      return self.cleaned_data
    else:
      raise ValidationError('两次输入密码不一致')
  else:
      # 这里面包括pwd和r_pwd两者之一,或者都不包括
    return self.cleaned_data

五、forms组件的渲染标签功能(推荐方式二)

渲染方式三种、错误信息的渲染方式

1、渲染方式一
先写后端校验类,再在前端渲染,charFiled渲染成input标签:

# 校验类
class UserForm(forms.Form):
  name = forms.CharField(min_length=4)
  pwd = forms.CharField(min_length=4)
  r_pwd = forms.CharField(min_length=4)
  email = forms.EmailField()
  tel = forms.CharField()

# 视图函数:用户注册
def reg(request):
  form = UserForm(request.POST)
  return render("reg_html",{"form":form})

为了方便,Django可以在前端按照后端写的校验类进行渲染
<form>
  {% csrf_token %}
  用户名:{{ form.name }}
  密码:{{ form.pwd }}
  确认密码:{{ form.r_pwd }}
  邮箱:{{ form.email }}
  电话:{{ form.tel }}
  <input type="submit">
</form>

2、渲染方式二:如果字段很多
class UserForm(forms.Form):
  name = forms.CharField(min_length=4, label="用户名")
  pwd = forms.CharField(min_length=4, label="密码")
  r_pwd = forms.CharField(min_length=4, label="确认密码")
  email = forms.EmailField(label="邮箱")
  tel = forms.CharField(label="电话")

def reg(request):
  form = UserForm(request.POST)
  return render("reg_html",{"form":form})
-------------------------------
<form>
  {% csrf_token %}
  {% for field in form %}
    <div>
    <label for="">{{ field.label }}</label>  {{ field }}
    </div>
  {% endfor %}
  <input type="submit">
</form>

-------------------------------
3、渲染方式三,自己搞着玩可以
<form>
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit">
</form>

4、渲染错误信息

-------视图函数------
def register(request):
  if request.method=="POST":
    form=UserForm(request.POST)
    if form.is_valid():
      clean = form.cleaned_data
    else:
      clean = form.cleaned_data
      errors = form.errors
      # NOTES:这里返回的页面可以保存用户上次已经填过的数据,还包括错误信息
    return render("reg_html",{"form":form})

  #如果是get请求,渲染空form页面
  form=UserForm()
  return render(request,"reg_html",{"form":form})
------------------------------

<form>
  {% csrf_token %}
  {% for field in form %}
    <div>    
      <label for="">{{ field.label }}</label>
       {{ field }}
      <span>{{ field.errors.0 }}</span>
    </div>
  {% endfor %}
  <input type="submit">
</form>

--------------------------------

Django组件--forms组件(注册用)的更多相关文章

  1. python 全栈开发,Day78(Django组件-forms组件)

    一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...

  2. django第13天(auth组件,forms组件,中间件,csrf)

    django第13天(auth组件,forms组件) auth组件 -auth组件 -auth是什么? -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... -怎么用? -( ...

  3. Django组件-Forms组件

    Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...

  4. django之forms组件

    在django中forms组件有其强大的功能,里面集合和众多的函数和方法:下面来看一下它的源码 """ Form classes """ f ...

  5. 08 Django组件-Forms组件

    Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...

  6. web框架开发-Django的Forms组件

    校验字段功能 针对一个实例:用户注册. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) ...

  7. Django组件—forms组件

    forms组件: 校验字段功能: 针对一个实例:注册用户. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...

  8. Django组件——forms组件

    一.校验字段功能 通过注册用户这个实例来学习校验字段功能. 1.模型:models.py from django.db import models # Create your models here. ...

  9. 12 Django组件-forms组件

    forms组件 校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...

随机推荐

  1. AspNetCoreMvc使用MongoDB,快来get一下吧。

    看这篇文章之前请耐心看完MongoDb入门,如果还是坚持不看,那我也没有办法. MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. ...

  2. Zara带你快速入门WPF(4)---Command与功能区控件

    前言:许多数据驱动的应用程序都包含菜单和工具栏或功能区控件,允许用户控制操作,在WPF中,也可以使用功能区控件,所以这里介绍菜单和功能区控件. 一.菜单控件 在WPF中,菜单很容易使用Menu和Men ...

  3. Qt之二进制兼容

    一.回顾 使用qt2年多了,但是还是觉得很陌生,总是会被qt搞的很紧张,有时候当我自信满满的打开帮助文档,搜索某个已知的类时,由于笔误敲错了一个字母而出现了另外一个类,不过奇怪的是还真有这么一个类,哎 ...

  4. SignalR学习笔记(四) 性能优化

    限制消息发送次数 这种方式在学习笔记(二)-  高并发应用中介绍过,在客户端和服务器端使用定时器来减少消息发送的次数 减少消息数据的大小 服务器端,可以使用JsonIgnore, 来忽略不需要序列化的 ...

  5. Flask 启动报错 error: [Errno 10053]

    首先这不是 Flask 库的异常,该报错经常出现在 Python2 中. 问题所在:Python2 中 SocketServer 模块的问题. 解决办法: 不要用自带的 Server,通过 gunic ...

  6. 《HelloGitHub月刊》第 05 期

    <HelloGitHub>第 05 期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 欢迎各路人士加入本项目,丰富月刊的内容,也可以直接在Issue(需要登录 ...

  7. mysqladmin实用工具

    mysqladmin命令行实用工具是命令行工具套件中的重量级工具.这个工具可以执行很多选项和工具(被称为命令). 因为这个实用工具是从命令行启动运行的,它使得管理员可以编写一系列操作脚本,这比直接运行 ...

  8. [HEOI2018] 秘密袭击coat

    Description 给定一棵 \(n\) 个点的树,每个点有点权 \(d_i\) ,请对于树上所有大于等于 \(k\) 个点的联通块,求出联通块中第 \(k\) 大的点权之和.\(n\le 166 ...

  9. nginx基础

    常见的能够提供web服务的程序有apache.IIS,nginx等,LLS是windows系统中的,nginx和apache是linux系统中的,nginx是一款高性能的http和反向代理的服务器. ...

  10. Chrome F12调试工具常用技巧

    原文地址:http://www.cnblogs.com/MuYunyun/p/5678405.html#3471461 阅读目录 Chrome调试工具介绍: 快速切换文件 在源代码中搜索 在源代码中快 ...