1.form组件的介绍
在之前的开发过程中,我们都会用一种最传统的方式写form表单。我们以注册为例子,分别讲解传统方式和用form组件的区别。
传统方式:
首先创建一个注册页面,页面里面有form表单。
然后form表单能够将数据提交到后端,并且后端对数据进行有效性校验。
最后把校验的提示展示到页面上,方便使用者查看。
form组件的方式:
1.可以自动生成html代码
2.能够进行数据有效性校验
3.校验信息并展示出来,同时会将原来的数据保存
注:前端和后端都可以对数据进行校验。前端通过JS进行校验,开发时,最好前端设置校验,后端必须写一个校验,因为前端的校验可以被跳过。
2.form组件的使用
在这里我直接给出例子,以展示如何使用form组件。

from django.shortcuts import render
from django import forms
from django.forms import widgets
# 定义一个form组件的类
class RegForm(forms.Form):
name = forms.CharField(
max_length=16,
label='用户名',
# widgets是Django对HTML输入元素的表示,后面的attrs能够设置样式
widget=widgets.TextInput(attrs={'class':'form-control'}),
error_messages={
'max_length':'用户名长度不能超过16'
}
)
pwd = forms.CharField(
min_length=6,
label='密码',
error_messages={
'min_length':'密码不可少于6位'
},
# 当密码校验出错时,render_value=True可以将错误的密码填回去,不让他消失
widget=widgets.PasswordInput(attrs={'class':'form-control'},render_value=True)
)
def reg(request):
# 使用这个类
forms_obj = RegForm()
if request.method == 'POST':
# 获取页面上传来的信息
forms_obj = RegForm(request.POST)
# 如果信息校验通过,则不处理,如果不通过,就把错误信息继续传到页面上
if forms_obj.is_valid:
pass
return render(request,'forms.html',{'forms':forms_obj})

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表单</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class=".container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
{# novalidate表示不用浏览器自带的校验检查#}
<form action="/reg/" method="post" novalidate>
{% csrf_token %}
<div class=".form-control">
{{ forms.name.label }}{#显示label标签#}
{{ forms.name }}{#显示label标签后面的框#}
{# 用来放置错误信息,为什么是error.0,这是因为错误信息里面可以放置多条,.0代表取第一条#}
<span class="help-block">{{ forms.name.errors.0 }}</span>
</div>
{# {% if forms.pwd.errors %}has-error{% endif %}表示当有错误时,让input框变红#}
<div class=".form-control {% if forms.pwd.errors %}has-error{% endif %}">
{{ forms.pwd.label }}
{{ forms.pwd }}
<span class="help-block">{{ forms.pwd.errors }}</span>
</div>
<div class=".form-control">
<input class="btn btn-default" type="submit" value="提交">
</div>
</form>
</div>
</div>
</div>
</body>
</html>

STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]

path('reg/', views.reg),
注:
forms_obj = RegForm(request.POST) print(forms_obj.cleaned_data) #所有通过校验的数据都以字典的形式保存在cleaned_data中
效果图:

3.自定义校验
往往别人为设置好的校验规则都不能满足我们所有的需求,这个时候我们需要自己写一个校验。比如若用户注册时,填写的注册名有骂人的词语时,那我们就要提示他“该注册名不能”,该怎么做呢?我们只需要在RegForm类里面加一个函数即可,RegForm类见上面的vies.py。

from django.core.exceptions import ValidationError
class RegForm(forms.Form):
...
def clean_name(self):
value = self.cleaned_data.get('name')
if '大傻逼' in value:
raise ValidationError('该注册名不能使用!')
return value
效果图:

在上面的代码中,我只给出来用户名和密码,没有给出确认密码,现在我加上确认密码,并且加上验证两次密码是否一致,该怎么写呢?

class RegForm(forms.Form):
...
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd != re_pwd:
self.add_error('re_pwd',ValidationError('两次密码填写不一致!'))
raise ValidationError('两次密码填写不一致!')
return self.cleaned_data
只需要加上这一步即可,其他的代码自己完善一下。
3.推荐博文
https://www.cnblogs.com/liwenzhou/p/8747872.html
