注册页面图解:
前端为了用户体验会做一些校验,不满足校验要求会报错
服务端也会对数据进行一些校验,不满足校验要求会报错
数据库也会对数据进行一些校验,不满足校验要求会报错
form组件和modleform组件就是让我们的数据校验过程更加简单一些,功能非常强大
1 .能够帮我们生成HTML 标签
2 .标签中保留之前用户输入的数据
3 .数据校验
1.在views.py文件中创建一个自定义的form类
from django import forms #需要先导入这个forms
class RegisterForm (forms .Form ):
phone = forms.CharField ()
username = forms.CharField ()
password = forms.CharFied ()
#用label参数可以将HTML 中的label标签中内容显示为中文
phone = forms.CharField (label ='手机号')
username = forms.CharField (label ='用户名')
password = forms.CharField (label ='密码')
def register (request) :
if request.method == 'GET' :
form = RegisterForm()
return render(request,'register.html' ,{'form' :form })
3.创建一个html文件,比如叫作register.html,内容如下
<!DOCTYPE html >
<html lang ='en' >
<head >
<meta charset ="UTF-8" >
<title > Title</title >
</head >
<body >
<h1 > 注册页面</h1 >
<form action ='/register/' method ='post' novalidate > #novalidate取消浏览器自带的错误提示
{% csrf_token %}
<div >
<label for ="{{ form.phone.id_for_label }}" > {{ form.phone.label }}</label >
{{ form.phone }}
</div >
<div >
<label for ="{{ form.username.id_for_label }}" > {{ form.username.label }}</label >
{{ form.username }}
</div >
<div >
<label for ="{{ form.password.id_for_label }}" > {{ form.password.label }}</label >
{{ form.password }}
</div >
<input type ='submit' >
</form >
</body >
</html >
保留原数据和校验功能
class RegisterForm(forms.Form):
phone = forms.CharField(
label ='手机号' ,
required=True,
error_messages={
'required' :'小敏敏提示您,不能为空!' ,
}
)
username = forms.CharField(label ='用户名' )
password = forms.CharField(label ='密码' )
def register (request ):
if request.method == 'GET' :
form = RegisterForm()
return render(request,'register.html' ,{'form' :form})
else :
print (request.POST)
form = RegisterForm(data=request.POST)
if form.is_valid():
print ('通过校验的数据' ,form.cleaned_data)
return HttpResponse('ok' )
print ('错误信息>>>' ,form.errors)
return render(request,'register.html' ,{'form' :form})
<!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > Title</title >
<style >
.error_msg{
font-size:12px;
color:red;
}
</style >
</head >
<body >
<h1 > 注册页面</h1 >
<form action ='/register/' method ='post' novalidate >
{% csrf_token %}
<div >
<label for ='{{ form.phone.id_for_label }}' > {{ form.phone.label }}</label >
{{ form.phone }}
<span class ='error_msg' > {{ form.phone.errors.0 }}</span >
</div >
<div >
<label for ='{{ form.username.id_for_label }}' > {{ form.username.label }}</label >
{{ form.username }}
<span class ="error_msg" > {{ form.username.errors.0 }}</span >
</div >
<div >
<label for ='{{ form.password.id_for_label }}' > {{ form.password.label }}</label >
{{ form.password }}
<span class ='error_msg' > {{ form.password.errors.0 }}</span >
</div >
<input type ='submit' >
</body >
</html >
username = fomrs.CharField(label='用户名' ,initial='小红' )
widget 插件的意思,能够定制我们的标签显示效果
示例1 密文输入框
password = forms.CharField(
label='密码' ,
#CharField默认插件是TextInput相当于type ='text' ,下面相当于修改type ='password' ,完整写法forms.widgets.PasswordInput,下面是简写
widget = forms.PasswordInput,
)
示例2 给标签加上一些其他属性
password = forms.CharField(
label='密码' ,
#attrs={'标签属性' :'属性值' }
widget=forms.PasswordInput(attrs={'class' :'c1 c2' ,'placeholder' :'请输入密码' }),
)
生成单选下拉框 ChoiceField默认插件是widget=forms.Select
sex = forms.ChoiceField(
choices=((1 ,'女' ),(2 ,'男' )),
label ='性别' ,
initial =2 ,
)
单选radio框 widget=forms.RadioSelect
sex = forms.ChoiceField(
choices=((1 ,'女' ),(2 ,'男' )),
label ='性别' ,
widget=forms.RadioSelect(attrs={'class' :'c1' })
)
多选下拉框 MultipleChoiceField
hobby = forms.MultipleChoiceField(
choices=((1 ,'喝酒' ),(2 ,'抽烟' ),(3 ,'励志' )),
label ='爱好'
)
多选checkbox框 widget=forms.CheckboxSelectMultiple
hobby = forms.MultipleChoiceField(
choices=((1 ,'喝酒' ),(2 ,'抽烟' ),(3 ,'励志' )),
label = '爱好' ,
widget=forms.CheckboxSelectMultiple,
)
单选功能的复选框形式,像那种勾选同意协议的那个选框 widget=forms.CheckboxInput 里面choices只有true或false
status = forms.MultipleChoiceField(
choices=(('True' ,同意),('Flase' ,不同意))
label='同意是否勾选协议' ,
widget=forms.CheckboxInput,
)
bday = forms.CharField(
label='生日' ,
widget=forms.TextInput(attrs={'type' :'date' }), 只要设置一个date 属性就可以了
)
单选或多选框使用数据库中的数据
方式1 forms.ModelChoiceField
models中的模型类
class Publish (models.Model):
name = models.CharField(max_length=32 )
def __str__ (self ):
return self.name
form类中的字段写法
publish = forms.ModelChoiceField(
queryset=models.Publish.objects.all (),
)
会自动生成单选下拉框,并且option标签value属性对应的值,是queryset参数对应的queryset集合里面的models模型类对象的id 值,option标签的文本内容是每个models模型类对象。
publish = forms.ChoiceField(
choices=models.Publish.objects.all ().values_list('id' ,'name' )
)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现