[Django高级之forms组件]

forms组件之校验字段

# 第一步:定义一个类,继承forms.Form
# 第二步:在类中写字段,要校验的字段,字段属性就是校验规则
# 第三步:实例化得到一个Form对象,把要校验的数据传入
# 第四步:调用 对象.is_valid()校验,校验通过就是True
可以判断是否符合定义的字段条件 # 第五步:校验通过有 对象.cleaned_data
获取符合校验规则的数据 # 第六步:校验不通过 对象.errors
获取不符合校验的字段、以及错误信息
前戏
写一个注册页面获取用户的用户名和密码
发送到后端之后在后端完成对用户名和密码的数据校验 1.用户名里面不能含有JPZ
2.密码不能为空 将提示信息渲染到前端页面 1.前端页面标签书写
2.前端页面信息展示
3.后端数据校验 forms组件可以一条龙服务 帮你完成上面的三件事情
1.渲染标签
2.校验数据
3.展示信息

forms组件校验数据

1、对象 .is_valid()

2、对象 .cleaned_data

3、对象 .errors

# forms代码书写

from django import forms

class MyForm(forms.Form):

    # username字段最少不能少于3位 最多不能超过8位
username = forms.CharField(max_length=8,min_length=3) # password字段最大值不能超过699
password = forms.IntegerField(max_value=699) # email字段必须符合邮箱格式
email = forms.EmailField() # 校验数据
from app01 import views
# 1.类加括号 传入字典即可
form_obj = views.MyForm({'username':'jason','password':'123','email':'嘿嘿嘿'}) # 2.判断数据是否合法(只有全部合法结果才为True)
form_obj.is_valid()
False # 3.查看所有合法的数据
form_obj.cleaned_data
{'username': 'jason', 'password': 123} # 4.查看所有不合法的数据及原因
form_obj.errors
{'email': ['Enter a valid email address.']} """
校验数据可以多传 但是不能少传(默认必填)
"""

校验数据可以多传 但是不能少传(默认必填)

forms组件渲染标签

def register(request):
if request.method == 'GET':
# GET请求没有数据,需要生成一个空form对象
# 这个form跟下面没有关系,是get请求过来的得到一个空form
register_form = RegisterFrom()
# 传到前端页面后,通过form进行渲染
return render(request, 'register.html', {'form': register_form})
else:
register_form = RegisterFrom(request.POST) if register_form.is_valid():
print('效验通过')
print(register_form.cleaned_data)
register_form.cleaned_data.pop('re_password')
models.User.objects.create(**register_form.cleaned_data)
else:
print('效验不通过')
print(register_form.errors) return render(request,'register.html')

渲染方式一

可扩展性强,但是需要书写的代码太多,一般情况下不用

 <h2>通过form自动渲染一</h2>
<form action="" method="post">
<p>用户名 {{ form.name }}</p>
<p>密码 {{ form.password }}</p>
<p>确认密码 {{ form.re_password }}</p>
<p>邮箱 {{ form.email }}</p>
<input type="submit" value="提交"></form>

渲染方式二

推荐使用,代码书写简单,并且可扩展性强

<h2>通过form自动渲染二(基本用这种)</h2>

<form action="" method="post">
{% for item in form %}
<p>{{ item.label }}{{ item }}</p>
{% endfor %}
<input type="submit" value="提交"><span style="color: red">{{ error }}</span> </form>

渲染方式三

代码书写极少,封装程度太高,不便于后续的扩展,一般情况下只在本地测试使用

<h2>通过form自动渲染三</h2>
<form action="" method="post">
{{ form.as_p }}
{# {{ form.as_table }}#}
{# {{ form.as_ul }}#} </form>

注意:#forms组件无法渲染提交按钮和form标签都需要你自己编写

forms组件展示提示信息

后端代码书写views.py

# 后端views中定义form类:

from django import forms
# forms代码书写
class Myform(forms.Form):
# 最多8位 最少3位
username = forms.CharField(max_length=8,min_length=3,label='用户名',
error_messages={
# 自定义错误信息
'max_length':'用户名最多8位',
'min_length':'用户名最少3位',
'required':'用户名不能为空',
},
widget=widgets.TextInput(attrs={'class':'form-control'}))
# 指定字段类型
) # 最多666位
password = forms.IntegerField(max_value=666,label='密码',
error_messages={
# 自定义错误信息
'max_length': '密码最多8位',
'min_length': '密码最少3位',
'required': '密码不能为空'
},
widget=widgets.PasswordInput(attrs={'class':'form-control'})) # 指定字段类型为 password
)
confirm_password = forms.IntegerField(max_value=666, label='确认密码',
error_messages={
# 自定义错误信息
'max_length': '确认密码最多8位',
'min_length': '确认密码最少3位',
'required': '确认密码不能为空'
})
# 必须符合邮箱格式
email = forms.EmailField(label='邮箱',
error_messages={ # 自定义错误信息
'invalid':'邮箱格式不正确',
'required': '邮箱不能为空',
}) -------------------------------------------------------------------- # views视图函数处理部分: def login(request):
# 1、先生成一个对象
form_obj = Myform()
# 2、判断请求方式
if request.method == 'POST': # 获取用户数据
# request.POST # 可以直接看成是一个字典
# 校验用户数据
# MyForm() # forms组件校验数据刚好需要传入一个字典
'''上述两步合一步''' # 3、校验数据 于上面对象名字必须一致
form_obj = Myform(request.POST)
# 4、判断数据是否合法
if form_obj.is_valid():
# 5、合法的话
return HttpResponse('登录成功') # 2.将该对象传递给html页面
return render(request,'login.html',locals())

前端代码书写login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<form action="" method="post" novalidate>
# 取消浏览器校验 novalidate {% for form in form_obj %}
<p>{{ form.label }}:{{ form }}
<span style="color: red">{{ form.errors.0 }}</span>
</p>
{% endfor %} <button class="btn btn-info">提交</button> </form>
</body>
</html>

forms组件常用参数

class Ret(Form):
name = forms.CharField(max_length=10, min_length=2, label='用户名',
error_messages={
'required': '该字段不能为空',
'invalid': '格式错误',
'max_length': '太长',
'min_length': '太短'},
widget=widgets.TextInput(attrs={'class':'form-control'})) max_length 最大范围
min_length 最小范围
label 字段文本内容
required 字段是否必填 默认是True
error_messages 定义提示信息
widget 定义字段类型和属性
validators 额外的校验功能(一般都是正则)
initial 设置默认值

forms组件钩子函数

除了上面两种方式,我们还可以在Form类中定义钩子函数,来实现自定义的验证功能。

局部钩子:

我们在Fom类中定义 clean_字段名() 方法,就能够实现对特定字段进行校验。

全局钩子:

我们在Fom类中定义 clean() 方法,就能够实现对字段进行全局校验。

提供更加复杂的与业务相关的校验功能
钩子函数其实就在书写forms类的过程中定义方法 '''钩子函数都是在数据校验的最后一个环节执行'''
-------------------------------------------------------------------------------------- 局部钩子(单个字段校验使用局部) # 校验当前用户名是否已存在
def clean_username(self):
# 获取用户名
username = self.cleaned_data.get('username')
# 查询数据库并判断
if username == 'jason':
# 提示用户名已存在
self.add_error('username','用户名已存在')
return username ----------------------------------------------------------------------------------- 全局钩子(多个字段校验使用全局)
# 校验密码与确认密码是否一致
def clean(self):
# 获取密码 与 确认密码
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if not password == confirm_password:
self.add_error('confirm_password','两次密码不一致')
return self.cleaned_data

常用字段与插件

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

initial

初始值,input框里面的初始值。

class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三" # 设置默认值
)
pwd = forms.CharField(min_length=6, label="密码")

error_messages

重写错误信息。

class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三",
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
}
)
pwd = forms.CharField(min_length=6, label="密码")

password

class LoginForm(forms.Form):
...
pwd = forms.CharField(
min_length=6,
label="密码",
widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
)

radioSelect

单radio值为字符串

class LoginForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三",
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
}
)
pwd = forms.CharField(min_length=6, label="密码")
gender = forms.fields.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3,
widget=forms.widgets.RadioSelect()
)

单选Select

class LoginForm(forms.Form):
...
hobby = forms.ChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=3,
widget=forms.widgets.Select()
)

多选Select

class LoginForm(forms.Form):
...
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple()
)

单选checkbox

class LoginForm(forms.Form):
...
keep = forms.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput()
)

多选checkbox

class LoginForm(forms.Form):
...
hobby = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple()
)

choice字段注意事项

在使用选择标签时,需要注意choices的选项可以配置从数据库中获取,但是由于是静态字段 获取的值无法实时更新,需要重写构造方法从而实现choice实时更新。

方式一:

from django.forms import Form
from django.forms import widgets
from django.forms import fields class MyForm(Form): user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
initial=2,
widget=widgets.Select
) def __init__(self, *args, **kwargs):
super(MyForm,self).__init__(*args, **kwargs)
# self.fields['user'].choices = ((1, '上海'), (2, '北京'),)
# 或
self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')

方式二:

from django import forms
from django.forms import fields
from django.forms import models as form_model class FInfo(forms.Form):
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) # 多选
# authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all()) # 单选

[Django高级之forms组件]的更多相关文章

  1. django中的forms组件

    form介绍 用户需要向后端提交一些数据时,我们常常把这些数据放在一个form表单里,采用form标签,里面包含一些input等标签把用户的数据提交给后端. 在给后端提交数据的时候,我们常常也需要对于 ...

  2. Django基础之forms组件中的ModelForm组件

    Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样 ...

  3. django中的forms组件(权限信息校验,增删改查)

    1.用处 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交的正确信息 4.如果其中有一个错误了,其他的正确,则保留上次输入的内容 5.自动创建input标签并可以设置样式 6.基于form ...

  4. Django框架的forms组件与一些补充

    目录 一.多对多的三种创建方式 1. 全自动 2. 纯手撸(了解) 3. 半自动(强烈推荐) 二.forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组 ...

  5. forms组件补充与ModelForm简单使用与cookie与session

    目录 forms组件钩子函数 forms组件字段参数 字段参数 validators详解 choices详解 widget详解 forms组件字段类型 ModelForm简单使用 cookie与ses ...

  6. Django学习之八:forms组件【对form舒心了】

    目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...

  7. Django组件-Forms组件

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

  8. Django组件--forms组件(注册用)

    一.forms组件--校验类的使用 二.form组件--校验类的参数 三.forms组件校验的局部钩子--自定义校验规则(要看源码理解) 四.forms组件校验的全局钩子--校验form表单两次密码输 ...

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

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

随机推荐

  1. JAVAEE_Servlet_23_路径编写总结和url_pattern的编写方式

    路径编写总结和url_pattern的编写方式 路径的编写 超链接 form表单的action属性 重定向 response.sendRedirect("/项目名/资源路径"): ...

  2. 一款轻量级的声明式http调用工具!

    前沿 项目中我们经常会使用HTTP工具向外部的REST接口发送请求,大家一般使用Okhttp,或者java的HttpClient发起,今天给大家介绍一款轻量级声明式的Http库(FeignClient ...

  3. fastjson反序列化漏洞实际案例利用

    fastjson反序列化rce实际案例利用全过程: 存在问题网站:http://***.com/ 在网站上寻找一些安全漏洞的时候,发现一条json数据包 数据包如下: POST /*** HTTP/1 ...

  4. 033- while循环语句

    语法 初始化语句; while(boolean表达式) { 循环体语句; 控制条件语句; } 执行过程: 只要boolean表达式里面的结果是true,就会执行while大括号里面的语句,直到bool ...

  5. js去重的两种方法

    去重 去重方法和思路也很多,这里就介绍两种吧. 方法一: 1 2 3 4 5 6 7 8 9 10 11 function unique1(arr) {       var res = [],     ...

  6. Windows Server系统加固

    目录 账户管理.认证授权 管理账户 管理口令 授权 审核策略 IP协议安全配置 设备其他配置操作 账户管理.认证授权 管理账户 说明: 对于管理员账号,要求更改缺省账户名称,并且禁用 guest (来 ...

  7. POJ2709 染料贪心

    题意:       要搭配出来n种颜料,每种颜料要用mi升,除了这n种颜色还有一个合成灰色的毫升数,灰色是由三种不同的颜色合成的,三种m m m 的不同颜色能合成m升灰色,然后问你满足要求至少要多少盒 ...

  8. 易酷CMS2.5本地文件包含漏洞复现

    易酷CMS是一款影片播放CMS.该CMS2.5版本存在本地文件包含漏洞.我们可以利用这个漏洞,让其包含日志文件,然后再利用报错信息将一句话木马写入日志中.然后利用文件包含漏洞包含该日志文件,再用菜刀连 ...

  9. MySQL的Double Write并不难理解

    目录 问题引入- 断电了 不一会 - 来电了 Double write工作流程 恢复的过程 配置参数 疑问 推荐阅读 问题引入- 断电了 今天为大家介绍一个新的名词:double write. 相信你 ...

  10. 每天一道面试题LeetCode 26--删除排序数组中的重复项(python实现)

    题目1:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...