[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. 自定义函数和调用函数 return返回值

    1.Q: 为什么要有函数,函数是什么? A: 函数能提高应用的模块性,和代码的重复利用率 2. 函数分为两个阶段: 1.定义阶段 2.调用阶段 3.关于函数调用: 01.函数的内存地址加上()就是调用 ...

  2. Go-15-flag.String 获取系统参数

    场景: 启动应用程序时,需要传入系统参数.例如:./start --b /notebook --p true --n 8 package main import ( "fmt" f ...

  3. BeetleX数据分析中间服务V3

    V3版可以对更多的数据场景分析,可以用在系统日志,销售数据,医疗门诊等不同行业的数据进行分析透视.而它的目标并不是简单地进行数据汇总,更注重于不同时间段和不同标签之前的数据的汇总和差异对比,通过数据的 ...

  4. spring boot 集成logstash 日志

    1.logstash 插件配置 logstash下config文件夹下添加 test.conf 文件内容: input{ tcp { mode => "server" hos ...

  5. Faiss源码剖析:类结构分析

    摘要:在下文中,我将尝试通过Faiss源码中各种类结构的设计来梳理Faiss中的各种概念以及它们之间的关系. 本文分享自华为云社区<Faiss源码剖析(一):类结构分析>,原文作者:HW0 ...

  6. 本地使用apache设置绑定多个域名

    Apache开启了使用虚拟主机的功能: 打开Apache安装目录下conf/httpd.conf文件,找到 #LoadModule vhost_alias_module modules/mod_vho ...

  7. hdu2433 spfa+mark[x][u][v]优化

    题意:           删除每一条边求最短路的和,每删除一个就输出一个和.    思路:         直接暴力可定TLE了,自己SB的尝试过,就要剪纸,当每次输出一个答案的时候我们没有必要再从 ...

  8. adbi学习:java hook实现机制

    adbi的java hook实现代码ddi不在之前下载的文件中,下载地址:https://github.com/crmulliner/ddi,具体的编译看readme里面很详细的介绍了.注意ddi代码 ...

  9. 设计模式-UML图简单介绍

    直接上法宝: 1.类(Class)     类图分三层:     第一层显示类的名称,如果是抽象类,则就用斜体显示.     第二层是类的特性,通常就是字段和属性.     第三层是类的操作,通常是方 ...

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

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