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>标签中

测试

Django Form组件_django

Django Form组件_前端_02

Django Form组件_django_03

Django Form组件_表单_04

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

指定表单的字段

​__all__​​ 使用模型中的所有字段

​['no','name','sex','address']​​指定字段

不指定 模板会使用表单变量传递的所有字段

exclude

排除字段​​exclude=['no']​

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>

Django Form组件_前端_05

点击添加按钮后 后台获取数据(只演示后台获取数据 未实现添加数据功能)

Django Form组件_字段_06