表单是Web项目中最常见也是最重要的模块之一,最常见的功能比如注册,登录等都涉及大量的表单功能,如果是一个Web管理系统,比如OA,进销存管理系统等,那涉及的表单就更多了。
比如一个学生信息维护表单的HTML代码如下:
<div class="container">
<h4>学生表单</h4>
<form method="post" action="/studentLogin/">
<!-- {% csrf_token %}-->
<div>
<p>
<label >学号:</label>
<input type="text" name="sid" >
</p>
</div>
<div >
<p>
<label for="name">姓名:</label>
<input type="text" id="name" name="name">
</p>
</div>
<div>
<p>
<label>性别:</label>
<select name="gender">
<option value="女">女</option>
<option value="男">男</option>
</select>
</p>
</div>
<!-- 提交按钮 -->
<button type="submit">提交</button>
</form>
</div>
本文通过Django自带的Form组件,在实例项目中的前端模板中生成表单。
开发环境搭建及软件准备
服务端:Python 3.8
Web框架:Django 3.2
数据库:MySQL mysql-8.0.13-winx64
开发工具IDE:Pycharm(社区版)
Django项目及数据库准备
我们新建一个Django项目DjangoForm,创建一个应用app01,创建一个数据库djangoform。
创建项目:DjangoForm
django-admin startproject DjangoForm
创建应用:app01
python manage.py startapp app01
注册应用:settings.py中完成配置修改
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01', #添加此项
]
创建数据库:djangoform
CREATE DATABASE IF NOT EXISTS djangoform DEFAULT CHARSET utf8;
引入MySQL:在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置:
import pymysql
pymysql.install_as_MySQLdb()
配置MySQL:打开setting.py 文件,找到DATABASES配置项,修改DATABASES配置项为如下内容:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'djangoform', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
创建简单Django数据模型:Student
# 学生表
class Student(models.Model):
sid = models.CharField('学号',max_length=12,primary_key=True)
name = models.CharField('姓名',max_length=20,unique=True)
gender = models.CharField('性别',max_length=2,choices=(('女','女'),('男','男')))
age = models.IntegerField('年龄')
sclass = models.CharField('班级',max_length=20,help_text='例如: 17-03')
email = models.EmailField('邮箱',default=None) # 默认为空 唯一值
# 修改显示的表的名字
class Meta:
verbose_name = '学生'
verbose_name_plural = '学生信息表'
def __str__(self):
return self.sid
生成数据表:
python manage.py makemigrations
python manage.py migrate
利用Django实现表单功能
在HTML中表单指的是一个包含表单元素的区域。
表单元素是允许用户在表单中输入内容,比如:文本域(textarea)、下拉列表、单选框(radio-buttons)、复选框(checkboxes)等等。
表单使用表单标签 <form> 来设置:
<form>
.
表单元素
.
<input type="submit" value="Submit" />
</form>
在Django框架下,我们可以直接在Django中定义一个Form包含我们在HTML <form> </form>中的所有的表单元素。
通过下面形式就可以完成一个表单在HTML上的设计。
<form>
{{ form }}
<input type="submit" value="Submit" />
</form>
Django的表单主要做了6件事。
(1)当用户第一次请求的时候返回默认的表单。默认的表单可能包含空字段,或者预先填充了初始值,如将某个时间字段设置为当前的日期。此时,Django认为该表单是“未绑定”的,因为表单不包含用户输入数据。
(2)从请求中接受数据,将数据绑定到表单中。也就是说,当需要展示表单时,直接使用这部分数据,其中可能也包含一些错误信息。
(3)对数据进行清理和验证。清理过程可以删除输入中的恶意内容(如无效的字符),然后将输入转换为Python对象;验证检查值是否适合该字段,如检查字符的长度,或者日期是否在某个范围内。
(4)如果检测到用户输入的数据无效,则重新显示表单,这次的表单包含用户输入的值和相关的错误信息。
(5)如果用户输入的信息验证有效,则会执行必要的业务逻辑,如将数据存储到数据库、发送电子邮件、返回搜索的结果或者上传一个文件等。
(6)完成所有操作后,用户被重定向到另一个页面。
下面我们介绍Django内置的两个用来生成表单的组件类。
1、Form类
Django表单的核心组件是Form类。
和Model类相似,Form类抽象了表单的呈现形式和工作方式。
Model类的字段可以映射到数据库表字段,类似地,Form类的字段可以映射到HTML用户界面元素。
Form类的字段也是类,这些类用于管理表单数据,并在表单数据提交到服务器后执行验证工作。
要使用Django的表单,首先我们需要在对应app文件夹下创建一个名为form.py的文件来包含我们的表单类。
比如我们在之前创建的app01文件夹系创建form.py文件。
在文件中定义个表单,代码如下:
from django import forms
from .models import *
# 表单
class StudentForm(forms.Form):
sid = forms.CharField(max_length=12, label='学号',)
name = forms.CharField(max_length=50, label='姓名')
gender = forms.ChoiceField(choices=[('女','女'),('男','男')],label='性别')
然后在templates文件夹下创建一个展示表单的html文件:student_form.html
输入如下代码即可生成一个表单:
<div class="container">
<h4>学生表单</h4>
<div>
<form action="" method="post">
{% csrf_token %}
{{ student }}
<!-- 提交按钮 -->
<input type="submit" value="提交">
{{ student.type.type }}
</form>
</div>
</div>
在vviews.py中定义一个View视图index,用来调用此表单页面:
def index(request):
# GET请求
if request.method == 'GET':
student = StudentForm()
return render(request, 'student_form.html',locals())
定义好路由url
urlpatterns = [
path('admin/', admin.site.urls),
# 首页的URL
path('', views.index),
]
运行服务器:
python manage.py runserver
好像和我们文章开头的表单有点不一样?
因为我们文章开头的表单每个元素都用段落标识<p>..</p>包含了。
在表单元素student后面简单增加.as_p 就可以实现我们简单的段落标识。
<div class="container">
<h4>学生表单</h4>
<div>
<form action="" method="post">
{% csrf_token %}
{{ student.as_p }}
<!-- 提交按钮 -->
<input type="submit" value="提交">
{{ student.type.type }}
</form>
</div>
</div>
我们还可以将每一个表单元素用table包含起来,只要在表单后添加.as_table就行了:
<div class="container">
<h4>学生表单</h4>
<div>
<form action="" method="post">
{% csrf_token %}
<table border="1">
{{ student.as_table }}
<!-- 提交按钮 -->
{{ student.type.type }}
</table>
<input type="submit" value="提交">
</form>
</div>
</div>
2、ModelForm类
很多时候,表单的字段和数据库的字段是紧密关联的。
大部分表单我们定义的时候实际上就是参考数据库字段来进行设计的,甚至字段名字也是一样的。
那我们有没可能直接从数据库中直接获取字段名字和对应的数据类型从而快速生成表单呢?
Django的ModelForm类就是这样的一个思路。
Django允许从一个模型中创建一个表单类,新建的表单类通过继承ModelForm类和定义模型属性来与模型关联起来。
用ModelForm类来实现一个表单,我们代码可以更简洁。
from django.forms import ModelForm
from app01.models import *
class StudentForm(ModelForm):
class Meta:
model = Student #关联到模型
fields = ['sid', 'name', 'gender']
以上就是今天的分享,实例很简单,大家可以通过代码练习,掌握如何利用Django快速实现一个Web应用表单。