文章目录
- 一、form简介
- 二、Form中常用字段约束与插件
- 三、form中的所有内置字段
-
- 1.内置字段
-
-
- Field字段字段
- CharField(Field)
- IntegerField(Field)
- FloatField(IntegerField)和DecimalField(IntegerField)
- BaseTemporalField(Field)
- RegexField(CharField)
- FileField(Field)
- ChoiceField(Field)
- ModelChoiceField(ChoiceField)
- ModelMultipleChoiceField(ModelChoiceField)
- TypedChoiceField(ChoiceField)
- TypedMultipleChoiceField(MultipleChoiceField)
- ComboField(Field)
- MultiValueField(Field)
- SplitDateTimeField(MultiValueField)
- GenericIPAddressField
-
- 四、字段校验
- 五、Hook钩子用法
- 六、ModelForm使用
一、form简介
我知道前端页面可以通过form表单向后端提交数据,需要用form表单将获取用户输入的标签包裹起来。
与此同时,很多场景,我们需要对用户的输入进行校验,如长度/格式合不合法,若不合法我们希望在相应的位置提示用户对应的错误信息。
如果我们通过js来实现上述效果,必然是可以的,但是过程很复杂,而Django中的form组件帮我们封装好了所有上述的功能,只需要调用一些接口就可以实现。
1.form组件的功能
form组件的功能
- 通过后端的form组件生成前端页面对应的HTML标签
- 对前端form页面提交的数据进行合法性校验,并作出相应提示
- 校验的之后可以保留前端页面输入内容,增加用户体验
2.form组件的简单使用
数据库模型准备
新建项目form_lesson下app01文件中的models.py
models.py
执行同步指令makemigrations和migrate同步到数据库,添加一些数据后表结构如下
form简单使用
使用form之前需要定义一个类,来继承forms.Form。
这里为了项目的整洁性,我们另起一个文件夹,命名utils,在里面写我们要定义的类
from django import forms
class LoginForm(forms.Form):
# 按照form组件定义自己的类,需要继承forms.Form
username = forms.CharField(
label="用户名",
min_length=8,
error_messages={
"required": "不能为空",
"invalid": "格式错误",
"min_length": "用户名最短8位"
},
widget=forms.widgets.TextInput(attrs={
"class": "form-control"})
) # form字段名称是前端input标签的name属性。
password = forms.CharField(
label="密码",
min_length=12,
widget=forms.widgets.PasswordInput(attrs={
"class": "form-control"})
)
在视图函数中写注册函数
from django.shortcuts import render,HttpResponse,redirect
from utils.formlesson import LoginForm # 导入自定义的RegFrom类
def login(request):
form_obj = LoginForm() # 实例化一个form对象
if request.method=="POST":
form_obj = LoginForm(data=request.POST) # 将input标签的name属性值和form字段相同的数据进行form校验
if form_obj.is_valid() and request.POST.get("username") == "alex" and request.POST.get("password") == "alex": # 用is_valid方法判断提交的数据是否合法
return HttpResponse("登录成功")
return render(request,"login.html",{
"form_obj":form_obj}) # 如果是get请求,返回页面,并且通过form对象在前端渲染获取html标签。
模板文件login.html文件
{
% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="col-sm-6 col-sm-offset-3">
<form action="{% url 'register' %}" method="post" novalidate> <!--novalidate告诉浏览器,不需要对输入内容做校验,以便我们使用自己的校验提示-->
{
% csrf_token %}
<!--第一种写法:直接生成,但是不利于个性化定制-->
{
{
form_obj.as_p }}
<!--第二种写法:更利于个性化的定制-->
<div class="form-group">
<label for="{
{ form_obj.username.id_for_label }}">{
{
form_obj.username.label }}</label>
<!--获取input标签的id给for属性,获取label提示的名字-->
{
{
form_obj.username }} <!--获取form对象的字段name,生成name="name"的input标签-->
{
{
form_obj.username.errors.0 }} <!--获取name字段校验后的错误提示-->
{
{
form_obj.errors }} <!--获取form标签全局的错误提示,里面统计了所有input标签的错误信息-->
</div>
<div class="form-group">
<label for="{
{ form_obj.password.id_for_label }}">{
{
form_obj.password.label }}</label>
{
{
form_obj.password }}
{
{
form_obj.password.errors.0 }}
</div>
<!--第三种写法:通过for循环对象中的字段,写法更加简便-->
{
% for field in form_obj %} <!--循环form对象中的所有字段,对每个字段生成相应的标签-->
<div class="form-group">
<label for="{
{ field.id_for_label }}">{
{
field.label }}</label>
{
{
field }}
{
{
field.errors.0 }}
</div>
{
% endfor %}
<input type="submit">
</form>
</div>
<div class="row">
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>
通过前端页面效果,验证了form组件的功能:
- 前端页面是form类的对象生成的 -->生成HTML标签功能
- 当用户名和密码输入为空或输错之后 页面都会提示 -->用户提交校验功能
- 当用户输错之后 再次输入 上次的内容还保留在input框 -->保留上次输入内容
二、Form中常用字段约束与插件
创建Form类时,主要涉及到【字段】和【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
1.常用字段约束与对应插件
我们通过在formlesson中再定义一个注册form类来演示不同字段约束的标签效果。
通过forms.widgets.插件名(attrs={key,val})来为标签指定插件以及添加属性,添加的属性可以应用bootstrap中的样式类。
initial
initial是input标签输入框中的初始值
from django import forms # 导入froms模块
class RegForm(forms.Form):
username = forms.CharField(
min_length=8, # 用户名最小长度
label="用户名",
initial="张三",
widget=forms.widgets.TextInput(attrs={
"class":"form-control"})
)
error_messages
自定义错误信息提示内容
class RegForm(forms.Form):
username = forms.CharField(
min_length=8,
label="用户名",
initial="张三",
error_messages={
# 自定义错误信息提示内容
"required": "内容不能为空", # 原本为
"invalid": "格式错误",
"min_length": "用户名最短8位"
},
widget=forms.widgets.TextInput(attrs={
"class":"form-control"}) # 给input标签的添加插件,并添加属性bootstrap样式属性
)