Django Form组件
主要功能
- 自动生成HTML表单元素,可以减少前端的代码编写。
- 通过表单字段类型、属性的定义,自动校验数据的合法性。
- 如果验证错误,将重新显示表单,已输入的数据不会被重置或清空,用户界面友好。
步骤
- 编写Django Form类
- 建立URL与视图函数对应关系
- 在视图函数中实例化DjangoForm类
- 视图函数向模板文件发送Django Form实例化对象变量
- 模板文件以一定形式显示Django Form实例化对象中存储的信息
编写Django Form类
Django Form对象一般用一个名为forms.py文件集中存放
在应用文件夹下创建forms.py文件
我的应用名为 fromtest
from django import forms
class test(forms.Form):
username=forms.CharField(label="用户名")
password=forms.CharField(label="密码")
lable 是在网页中显示的字段名
创建url
from django.contrib import admin
from django.urls import path
from fromtest.views import testform
urlpatterns = [
path('admin/', admin.site.urls),
path('testform/',testform)
]
编写视图函数
from django.shortcuts import render
from django.http import HttpResponse
from . import forms
# Create your views here.
def testform(request):
if request.method == "POST":
# 通过request.POST给form对象赋值
test_forms=forms.test(request.POST)
# 表单验证 判断数据的有效性
#判断数据的有效性是依据Form类中的字段类型和对字段的有效性约束
#有效性约束是通过字段属性来实现的
if test_forms.is_valid():
# 取值
username=test_forms.cleaned_data.get('username')
password=test_forms.cleaned_data.get('password')
if (username==password and username!=None):
return HttpResponse('登录成功')
else:
return HttpResponse('用户名或密码错误')
else:
return HttpResponse('数据不合法')
# 初始化一个form对象
test_forms=forms.test()
return render(request,'testform.html',{'testform':test_forms})
form.is_valid()返回true后
表单数据被存储在form.cleaned_data中
这个属性是字典类型,字典的键名就是Form中定义的字段名
字典键值是提交的数据,因此可以通过get()函数取得表单数据
模板代码、
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form测试</title>
</head>
<body>
<div align="center">
<h1>测试</h1>
<form action="/testform/" method="post">
{% csrf_token %}
{{ testform.as_p }}
<div><input type="submit" value="登录"></div>
</form>
</div>
</body>
</html>
{% csrf_token%}用来防御CSRF攻击。
{{ testform.as_table }}以表格的形式显示表单数据,将字段放在<tr>标签中
{{ testform.as_ul }}以<ul>标签样式显示,将字段放在<li>标签中
{{ testform.as_p }}将字段放在<p>标签中
测试
Form 字段
例子:
telephone = forms.CharField(
label='电话',
min_length=11,
error_messages={
'required':'内容不能为空',
'invalid':'格式错误',
'min_length':'最少11位'
}
)
通用属性
- label 生成HTML文件中的label标签
- label_suffix label内容后缀 默认为 “:”
- inital 字段初始值
- help_text 字段描述信息
- error_messages 指定错误信息
- required 指定字段值是否可为空
- disabled 指定字段是否可编辑
- widget 指定字段的HTML标签形式
如果不指定widget Django会根据字段的类型指定默认标签
如果指定了widget,就会按照widget指定的类型在HTML网页中生成对应的标签
widget=forms.widgets.PasswordInput(attrs={'class':'password'},rv=True)
通过widget指定字段的输入框类型为密码输入型
通过attrs传递一个字典值以设置 input 标签的各种属性
render_value=True表示输入框校验不通过时,保留当前输入值
widget=forms.widgets.RadioSelect()
生成type="radio"的<input>标签。
widget=forms.widgets.Select()
生成<select>标签。
widget=forms.widgets.SelectMultiple()
生成可多选的<select>标签。
widget=forms.widgets.CheckboxInput()
生成type="checkbox"的<input>标签。
特有属性
ChaField字段
- min_length指定字段最小长度
- max_length指定最大长度
- strip指定是否清除用户输入的空白
ChoiceField字段
- choices限定字段值的可选项,用元组类型设置该属性,如choices = ((0,‘男’),(1,‘女’),)
File Field字段
- allow_empty_file设置上传文件是否允许为空文件,是Boolean类型属性
值类型字段主要包括IntegerField、DecimalField、FloatField等类型字段
- max_value指定字段的最大值
- min_value指定字段的最小值
- max_digits指定字段的总长度,是Decimal Field类型独有的属性
- decimal_places指定字段的小数位长度,Decimal Field类型独有
常用字段
CharField
telephone = forms.CharField(
label='电话',
min_length=11,
error_messages={
'required':'内容不能为空',
'invalid':'格式错误',
'min_length':'最少11位'
}
)
数值类型字段
IntegerField、FloatField、DecimalField
a=forms.IntegetField(max_value=100,min_value=10)
b=forms.FloatField(max_value=99.9,min_value=5.5)
c=forms.DecimalField(max_value=1050.25,min_value=100.5,max_digits=7, decimal_places=2)
日期时间字段
date=forms.DateField()
time=forms.TimeField()
datetime=forms.DateTimeField()
#DateField 为yyyy-mm-dd形式,如 2021-12-12
#TimeField 为hh:mm形式,如 22:00
#DateTimeField 为yyyy-mm-dd hh:mm形式 如 2021-12-12 22:00
Choice Field字段
如果不指定widget,默认在页面上生成<select>标签
sex = forms.ChoiceField(choices=((1, '男'), (2, '女'),),initial=1)
EmailField字段
url = forms.EmailField(label='邮箱', required=False)
Django ModelForm组件
可以直接将模型字段传递给模板,并将其渲染成需要的页面操作功能,省掉了Form类对表单字段的定义过程。
常用属性 | |
model | 指定模型对象 |
fields | 指定表单的字段 |
| |
| |
不指定 模板会使用表单变量传递的所有字段 | |
exclude | 排除字段 |
labels | 设置网页上显示的字段名 |
widgets | 设置表单字段的widget参数值 |
help_texts | 设置表单字段的help_text参数值 |
localized_fields | 指定模型字段设置为本地化格式的表单字段 |
field_classes | 自定义表单实例化的字段类型 |
error_messages | 指定表单字段的error_messages参数 |
forms.py文件
from django import forms
from fromtest import models
class ModelForm1(ModelForm):
# 添加模型外的字段
test = forms.CharField(label='测试')
class Meta:
#指定模型
model=models.students
# fields='__all__' 使用模型中的所有字段
fields=['no','name','sex','address']
labels={'no':'学号','name':'姓名','sex':'性别','address':'地址'}
error_messages={
'name':{'required':'姓名不能为空'}
}
help_texts={
'name': '*必填'
}
models.py 为
from django.db import models
# Create your models here.
class students(models.Model):
no=models.CharField('学号',max_length=8,unique=True,primary_key=True)
name=models.CharField('姓名',max_length=12)
sex=models.CharField('性别',max_length=2)
address=models.CharField('地址',max_length=40)
views.py
from django.shortcuts import render
from django.http import HttpResponse
from . import forms
# Create your views here.
def testform(request):
if request.method == "POST":
test_forms=forms.ModelForm1(request.POST)
if test_forms.is_valid():
no=test_forms.data.get('no')
print('学号:',no)
name = test_forms.data.get('name')
print('姓名:', name)
sex = test_forms.data.get('sex')
print('性别:', sex)
address = test_forms.data.get('address')
print('地址:', address)
test = test_forms.data.get('test')
print('测试:', test)
return HttpResponse('测试成功')
else:
return HttpResponse('数据不合法')
test_forms=forms.ModelForm1(instance=None)
return render(request,'testform.html',{'testform':test_forms})
模板代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form测试</title>
</head>
<body>
<div align="center">
<h1>测试</h1>
<form action="/testform/" method="post">
{% csrf_token %}
{{ testform.as_p }}
<div><input type="submit" value="添加"></div>
</form>
</div>
</body>
</html>
点击添加按钮后 后台获取数据(只演示后台获取数据 未实现添加数据功能)