[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. 深入了解Zookeeper核心原理

    之前的文章Zookeeper基础原理&应用场景详解中将Zookeeper的基本原理及其应用场景做了一个详细的介绍,虽然介绍了其底层的存储原理.如何使用Zookeeper来实现分布式锁.但是我认 ...

  2. sql指令,增,删,查,改

    增 insert into table (name,sex,age) value('张三','男','20')   向表中的name,sex,age,分别添加张三,男,20的内容 查 select  ...

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

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

  4. CVPR2021 | 华为诺亚实验室提出Transformer in Transformer

    前言: transformer用于图像方面的应用逐渐多了起来,其主要做法是将图像进行分块,形成块序列,简单地将块直接丢进transformer中.然而这样的做法忽略了块之间的内在结构信息,为此,这篇论 ...

  5. ASP.NET Core 存储session取不到值

    该项目是一个mvc项目,我使用session存储登录后的用户信息,然后发现登录信息存储到session正常,这个时候立马去获取也正常 但是如果我跳转到首页后,再去获取session信息,发现sessi ...

  6. python 自动化审计

    基于python的自动化代码审计 代码审计 逢魔安全实验室   2018-02-11  10,539   本文通过介绍在python开发中经常出现的常规web漏洞,然后通过静态和动态两种方式对pyth ...

  7. Win64 驱动内核编程-4.内核里操作字符串

    内核里操作字符串 字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花 样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*.WCHAR*.ANSI_STRIN ...

  8. 8.PHP图像处理

    PHP图像处理 GD2 Jpgraph 创建一个画布: <?php    header('content-type:image/gif');    //echo "你好";  ...

  9. 预防NSA勒索病毒攻击脚本

    预防445端口勒索病毒修复脚本 直接复制下去,创建一个文件,名字随意后缀是.bat,然后双击就可以了(如果提示拒绝访问,就直接右键管理员,尤其是Win8 Win10). :+添加关键注册表以及停掉并且 ...

  10. 四次挥手中你还不知道的ACK机制

    为面试做准备中. 后面有对ACK机制的详细讲解. 四次挥手比较好解释. 看一下我的草图. ACK表示发来的数据已确认接收无误. 图中一个箭头代表一次挥手. 第一次挥手: 主动关闭方:发送一个FIN,表 ...