Django Form 表单的主要作用是对表单字段进行集中管理,主要功能介绍如下:
(1) 自动生成HTML表单元素,可以减少前端代码的编写。一方面字段类型生成默认标签,如CharField对应HTML中的 < input >标签;另一方面可以通过widget属性来渲染成HTML元素,如:forms.widgets.Select()对应的HTML中的< select > 标签。
(2) 通过表单字段类型、属性的定义,自动产生校验表单数据的合法性的功能。例如:EmailField表示email字段。如果这个字段不是有效的电子邮箱格式,就会产生错误。
(3) 如果验证错误,将重新显示表单,已经输入的数据不会被重置或清空,用户界面友好。
(4) Django Form 表单可以用CSS和JavaScript资源进行渲染,使页面美观
Django Form 开发主要有5个步骤:
- 编写Django Form类
- 建立URL与视图函数对应的关系
- 视图函数中实例化Django Form类
- 视图函数向模板文件发送Django Form实例化对象变量
- 模板文件以一定的形式显示Django Form实例化对象中存储的字段信息
1.获取数据
2.验证数据
3.如果数据有问题,则返回给前端并提示用户
4.如果数据没有问题,则继续往下执行
1.验证数据需要大量的判断语句
2.需要自己构建错误信息字典给前端显示
3.前端的所有表单标签都是自己写的,会导致两个问题.第一个问题就是前端的验证有可能写少了,第二个问题是开发效率不高
Title
2.3.2视图函数
def test_form(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
email = request.POST.get('email')
print(f'用户名:{username}密码:{password}邮箱:{email}')
# 数据校验
'''
用户名长度太短
密码符合要求
邮箱为空
errors = {
'username':{
'min':'用户名太短',
},
'email':{
'blank':'用户名不能为空'
},
}
'''
error = {}
if len(username) < 3:
if error.get('username'):
error.get('username')['min'] = '用户名太短'
else:
error['username'] = {'min':'用户名太短'}
if len(username) > 6:
if error.get('username'):
error.get('username')['max'] = '用户名太长'
else:
error['username'] = {'max':'用户名太长'}
if username.strip() == '':
if error.get('username'):
error.get('username')['blank'] = '用户名不能为空'
else:
error['username'] = {'blank':'用户名不能为空'}
if len(password) < 3:
if error.get('password'):
error.get('password')['min'] = '密码太短'
else:
error['password'] = {'min':'密码太短'}
if len(password) > 6:
if error.get('password'):
error.get('password')['max'] = '密码太长'
else:
error['password'] = {'max':'密码太长'}
if password.strip() == '':
if error.get('password'):
error.get('password')['blank'] = '密码不能为空'
else:
error['password'] = {'blank':'密码不能为空'}
if len(email) < 3:
if error.get('email'):
error.get('email')['min'] = '邮箱太短'
else:
error['email'] = {'min':'邮箱太短'}
if len(email) > 6:
if error.get('email'):
error.get('email')['max'] = '邮箱太长'
else:
error['email'] = {'max':'邮箱太长'}
if email.strip() == '':
if error.get('email'):
error.get('email')['blank'] = '邮箱不能为空'
else:
error['email'] = {'blank':'邮箱不能为空'}
# (用户名长度最小为3,最大为6,不为空(不能全是空格))
# (密码长度最小为3,最大为6,不为空(不能全是空格))
# (邮箱长度最小为3,最大为6,不为空(不能全是空格))
# 全部校验完成,如果所有字段都符合要求,就插入数据
if not error:
print('插入数据')
return HttpResponse('展示页面')
else:
data = {
'error':error
}
return render(request,'test_form.html',data)
# 如果有字段不符合要求,则显示在前端页面
return render(request,'test_form.html')
三、使用Django Form组件处理表单数据
3.1Django Form组件处理表单数据流程
1.在应用程序目录下新建一个forms.py文件
2.在该文件中定义我们的表单组件
3.在视图函数中,将所有数据都给自定义的表单组件
4.使用is_valid()方法进行数据校验,如果所有字段都符合要求,则返回True,否则返回False.如果返回的是False,则表单中的errors会带上所有的错误信息
5.在模板文件中我们可以使用一个模板变量来代替所有的表单标签
# 1.导入forms模块
from django import forms
# 2.创建一个自定义的表单类,继承自forms.Form
class UserForm(forms.Form):
# 3.定义表单的字段值
'''
min_length:最小长度限制
max_length:最大长度限制
required:必填项,默认为True
label:指定label标签的内容
error_messages:自定义错误信息
widget:指定渲染的标签形式(可以指定标签的属性)
'''
username = forms.CharField(
min_length=3,
max_length=6,
required=True,
label='用户名',
error_messages={
'min_length':'用户名太短了',
'max_length':'用户名太长了',
'required':'用户名不能为空',
},
widget=forms.TextInput(attrs={'style':'color: red'})
)
password = forms.CharField(
min_length=3,
max_length=6,
required=True,
label='密码',
)
email = forms.EmailField(
min_length=3,
max_length=12,
required=True,
label='邮箱',
)
3.2.2模板
Title
3.2.3视图函数
from .forms import *
def test_form_new(request):
if request.method == 'POST':
# 2.使用前端传上来的数据创建表单对象
form = UserForm(request.POST)
# 3.验证数据
# is_valid():如果所有字段都符合要求,则返回True,否则返回False
# 如果返回的是False,则表单中的errors会带上所有的错误信息
if form.is_valid():
# 4.获取数据,当数据验证成功后,数据会被存放在cleaned_data里
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
email = form.cleaned_data.get('email')
print(f'用户名:{username}密码:{password}邮箱:{email}')
print('插入数据')
return HttpResponse('展示页面')
else:
data = {
'form':form
}
return render(request,'test_form_new.html',data)
# get请求不需要验证数据,直接返回空表单
form = UserForm()
data = {
'form': form
}
return render(request, 'test_form_new.html', data)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)