Skip to content

表单验证(Form)

表单验证是模块开发的第二步,用于对前端提交的数据进行验证。项目使用 Django 的 ModelForm 实现表单验证,所有错误信息使用中文提示。

文件位置

application/example/forms.py

完整代码

python
from django import forms

from application.example import models


# =============================================================
# 案例表单验证类
# =============================================================

class ExampleForm(forms.ModelForm):
    """
    案例表单验证类

    用于创建和更新案例信息时的表单验证。
    包含案例名称, 案例图片, 案例类型等属性

    验证字段包括:
    - name: 案例名称
    - avatar: 案例图片
    - type: 案例类型
    - status: 案例状态(1-正常, 2-禁用)
    - sort: 排序
    """

    # ----------------------------------------------------------
    # 案例名称
    # ----------------------------------------------------------
    # 字段说明: 案例的名称
    # 字段类型: 字符串(CharField)
    # 验证规则: 必填(required=True),最大长度100字符
    # 业务说明: 案例的核心标识字段,用于列表展示和搜索
    name = forms.CharField(
        required=True,
        max_length=100,
        error_messages={
            'required': '案例名称不能为空',
            'max_length': '案例名称长度不得超过100个字符',
        }
    )

    # ----------------------------------------------------------
    # 案例图片
    # ----------------------------------------------------------
    # 字段说明: 案例的图片
    # 字段类型: 字符串(CharField)
    # 验证规则: 可选(required=False),最大长度255字符
    # 业务说明: 用于案例列表展示和详情页的图片
    avatar = forms.CharField(
        required=False,
        max_length=255,
        error_messages={
            'max_length': '案例图片长度不得超过255个字符',
        }
    )

    # ----------------------------------------------------------
    # 案例类型
    # ----------------------------------------------------------
    # 字段说明: 案例的分类类型
    # 字段类型: 整数(IntegerField)
    # 验证规则: 必填(required=True),取值范围1-4
    # 业务说明: 对案例进行分类管理,支持按类型筛选
    type = forms.IntegerField(
        required=True,
        min_value=1,
        max_value=4,
        error_messages={
            'required': '案例类型不能为空',
            'min_value': '案例类型值不能小于1',
            'max_value': '案例类型值不能大于4',
        }
    )

    # ----------------------------------------------------------
    # 案例状态
    # ----------------------------------------------------------
    # 字段说明: 案例的显示状态
    # 字段类型: 整数(IntegerField)
    # 验证规则: 必填(required=True),取值范围1-2
    # 业务说明: 1-正常, 2-禁用,控制案例是否在前端展示
    status = forms.IntegerField(
        required=True,
        min_value=1,
        max_value=2,
        error_messages={
            'required': '案例状态不能为空',
            'min_value': '案例状态值不能小于1',
            'max_value': '案例状态值不能大于2',
        }
    )

    # ----------------------------------------------------------
    # 排序
    # ----------------------------------------------------------
    # 字段说明: 案例的排序权重
    # 字段类型: 整数(IntegerField)
    # 验证规则: 必填(required=True)
    # 排序规则: 数值越小越靠前
    # 业务说明: 手动控制案例在列表中的显示顺序
    sort = forms.IntegerField(
        required=True,
        error_messages={
            'required': '排序不能为空',
        }
    )

    # =============================================================
    # 表单元数据配置
    # =============================================================

    class Meta:
        """
        表单元数据配置类

        定义表单绑定的模型和需要验证的字段。
        """

        # 绑定模型
        # 指定该表单对应的数据模型为 Example(案例)
        model = models.Example

        # 指定需要验证的字段
        # 只验证以下字段,其他字段不进行表单验证
        fields = [
            'name',
            'avatar',
            'type',
            'status',
            'sort',
        ]

代码解析

Form 类继承

python
class ExampleForm(forms.ModelForm):
基类来源提供能力
forms.ModelFormDjango 内置自动绑定模型、字段验证、cleaned_data

ModelForm 会根据绑定的模型自动生成表单字段,但项目中通常手动重新定义每个字段以设置中文错误提示。

字段定义

字符串字段

python
name = forms.CharField(
    required=True,
    max_length=100,
    error_messages={
        'required': '案例名称不能为空',
        'max_length': '案例名称长度不得超过100个字符',
    }
)
参数说明
required=True必填字段
max_length=100最大长度 100 字符
error_messages自定义错误提示(中文)

整数字段

python
type = forms.IntegerField(
    required=True,
    min_value=1,
    max_value=4,
    error_messages={
        'required': '案例类型不能为空',
        'min_value': '案例类型值不能小于1',
        'max_value': '案例类型值不能大于4',
    }
)
参数说明
required=True必填字段
min_value=1最小值
max_value=4最大值
error_messages自定义错误提示(中文)

可选字段

python
avatar = forms.CharField(
    required=False,
    max_length=255,
    error_messages={
        'max_length': '案例图片长度不得超过255个字符',
    }
)

required=False 表示该字段为可选字段,不填时不会报错。

Meta 类配置

python
class Meta:
    model = models.Example
    fields = ['name', 'avatar', 'type', 'status', 'sort']
配置项说明
model绑定的数据模型
fields需要验证的字段列表

错误信息提取

表单验证失败时,使用 utils/regular.py 中的 get_err() 函数提取错误信息:

python
from utils import regular

form = forms.ExampleForm(data)
if not form.is_valid():
    return R.failed(msg=regular.get_err(form))

get_err() 函数的实现:

python
def get_err(form):
    """获取表单错误文本,多个错误用'/'分隔"""
    error_list = []
    for item in form.errors.get_json_data().values():
        error_list.append(item[0].get('message'))
    err_str = '/'.join(error_list)
    return err_str

例如,如果 nametype 都验证失败,返回的错误信息为:

案例名称不能为空/案例类型不能为空

在 Service 中使用

表单验证通常在 Service 层的添加和更新函数中调用:

python
def add_example(request):
    # 解析请求参数
    data, error = parse_request_body(request)
    if error:
        return R.failed(msg=error)

    # 表单验证
    form = forms.ExampleForm(data)
    if not form.is_valid():
        return R.failed(msg=regular.get_err(form))

    # 获取验证后的数据
    cleaned_data = form.cleaned_data
    # ... 创建记录

常用验证规则

字段类型验证参数说明
CharFieldrequired, max_length, min_length字符串长度
IntegerFieldrequired, min_value, max_value整数范围
EmailFieldrequired邮箱格式
URLFieldrequiredURL 格式

开发要点

  1. 所有错误信息必须使用中文:便于前端直接展示给用户
  2. error_messages 覆盖所有验证规则:required、max_length、min_value 等
  3. 可选字段设置 required=False:避免不必要的验证错误
  4. Meta.fields 列出所有需要验证的字段:未列出的字段不进行验证
  5. 使用 regular.get_err() 提取错误信息:统一的错误信息格式

总结

表单验证使用 Django ModelForm,手动重新定义每个字段以设置中文错误提示。Meta 类绑定数据模型并指定需要验证的字段。验证失败时使用 regular.get_err() 提取错误信息,多个错误用 / 分隔。

小蚂蚁云团队 · 提供技术支持