Files
djangoadmin-wiki/DjangoAdmin_Django_NaiveVue/zh/volume2/form.md
T
2026-09-12 23:12:15 +08:00

5.9 KiB
Raw Blame History

表单验证(Form)

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

文件位置

application/example/forms.py

完整代码

from django import forms

from application.example import models


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

    用于创建和更新案例信息时的表单验证。
    验证字段包括:name, avatar, type, status, sort
    """

    # 案例名称
    name = forms.CharField(
        required=True,
        max_length=100,
        error_messages={
            'required': '案例名称不能为空',
            'max_length': '案例名称长度不得超过100个字符',
        }
    )

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

    # 案例类型
    type = forms.IntegerField(
        required=True,
        min_value=1,
        max_value=4,
        error_messages={
            'required': '案例类型不能为空',
            'min_value': '案例类型值不能小于1',
            'max_value': '案例类型值不能大于4',
        }
    )

    # 案例状态
    status = forms.IntegerField(
        required=True,
        min_value=1,
        max_value=2,
        error_messages={
            'required': '案例状态不能为空',
            'min_value': '案例状态值不能小于1',
            'max_value': '案例状态值不能大于2',
        }
    )

    # 排序
    sort = forms.IntegerField(
        required=True,
        error_messages={
            'required': '排序不能为空',
        }
    )

    class Meta:
        model = models.Example
        fields = [
            'name',
            'avatar',
            'type',
            'status',
            'sort',
        ]

代码解析

Form 类继承

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

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

字段定义

字符串字段

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

整数字段

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 自定义错误提示(中文)

可选字段

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

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

Meta 类配置

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

错误信息提取

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

from utils import regular

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

get_err() 函数的实现:

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

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

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

在 Service 中使用

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

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
    # ... 创建记录

常用验证规则

字段类型 验证参数 说明
CharField required, max_length, min_length 字符串长度
IntegerField required, min_value, max_value 整数范围
EmailField required 邮箱格式
URLField required URL 格式

开发要点

  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() 提取错误信息,多个错误用 / 分隔。