在前后端交互中,“表单” 是用户输入数据、后端接收数据的核心载体。Django5 提供了一套强大的表单处理机制,不仅能快速生成表单界面,还能自动完成数据验证、错误提示和模型交互,极大减少重复开发工作。本文将从基础的 Form 类入手,逐步深入 ModelForm 与表单验证,帮你掌握 Django 表单的核心能力
一、Django表单核心概念:为什么需要表单
在Web开发中,表单的核心作用是“桥梁”——连接用户输入(前端)与后端处理(数据验证、存储)。没有表单时,你需要手动编写HTML表单、处理请求参数、验证数据格式(如邮箱合法性,密码长度),而Django表单这些流程封装成标准化组件,主要解决三个问题:
1、快速生成表单界面:无需手动写 HTML 输入框,Django 自动渲染表单字段
2、自动化数据验证:内置邮箱、长度、格式等验证规则,自定义验证也只需少量代码
3、简化模型交互:ModelForm 直接关联数据库模型,实现“表单提交→数据存储”一步到位
Django表单主要分为两类:
① Form类:不直接关联模型,适用于独立表单(如登录、留言、搜索)
② ModelForm类:继承 Form 并关联模型,适用于模型数据的添加、编辑(如文章发布、用户注册)
二、Form 类:独立表单的基础实现
Form 类是Django表单的“基石”,用于创建与数据库模型无直接关联的表单。例如用户留言、联系我们、搜索框等场景,都可以用Form类快速实现
2.1 定义Form类:描述表单结构
Form 类定义在应用的 forms.py 文件中,通过继承 django.forms.Form,并定义字段属性(如用户名、邮箱)来描述表单结构。每个字段对应一个 HTML 输入组件,并可配置标签、验证规则、显示样式(widget)
简单示例:创建留言表单
# myapp/forms.py
from django import forms
class ContactForm(forms.Form):
"""用户留言表单:包含姓名、邮箱、留言内容"""
# 1. 姓名字段:CharField(短字符串),标签为“姓名”,最大长度100
name = forms.CharField(
label='姓名', # HTML中<label>标签的文本
max_length=100, # 最大输入长度(前端限制+后端验证)
widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': '请输入您的姓名'}) # 自定义HTML属性(样式、提示)
)
# 2. 邮箱字段:EmailField(自动验证邮箱格式)
email = forms.EmailField(
label='邮箱',
widget=forms.EmailInput(attrs={'class': 'form-control', 'placeholder': '请输入您的邮箱'})
)
# 3. 留言字段:CharField + Textarea(多行文本框)
message = forms.CharField(
label='留言',
widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 5, 'placeholder': '请输入您的留言'}),
min_length=10, # 最小输入长度(后端验证)
)
关键字段类型说明:
| 字段类型 | 作用 | 适用场景 |
| CharField | 短字符串输入(单行) | 姓名、标题、用户名 |
| EmailField | 邮箱输入(自动验证格式) | 邮箱地址 |
| PasswordField | 密码输入(隐藏显示) | 密码、确认密码 |
| IntegerField | 整数输入(验证数字格式) | 年龄、数量 |
| DecimalField | 小数输入(精确到指定位数) | 价格、评分 |
2.2 视图处理 Form:接收、验证、处理数据
定义好Form类后,需要在视图中处理两个核心场景:
1、GET请求:返回空表单,供用户填写
2、POST请求:接收用户提交的表单数据,验证合法性,处理有效数据(如保存到数据库、发送邮件)
示例:处理留言表单提交
# myapp/views.py
from django.shortcuts import render, redirect
from .forms import ContactForm
# 可选:导入邮件模块,实现“提交留言后发送邮件”
from django.core.mail import send_mail
from django.conf import settings
def contact(reque


1276

被折叠的 条评论
为什么被折叠?



