Skip to content

参数验证

使用 Django ModelForm 进行请求参数验证。所有请求体参数通过 Django Form 定义,视图中调用 form.is_valid() 自动验证,验证失败通过 regular.get_err() 提取错误信息返回前端。

基本用法

定义表单类

python
# application/level/forms.py
# +======================================================================
# | 模块: 职级表单验证
# | 说明: 职级创建/编辑的请求数据校验
# +======================================================================

from django import forms
from application.level.models import Level


class LevelForm(forms.ModelForm):
    """职级创建/编辑表单"""

    class Meta:
        model = Level
        fields = ['name', 'status', 'sort']
        error_messages = {
            'name': {
                'required': '职级名称不能为空',
                'max_length': '职级名称不能超过150个字符',
            },
        }

端点使用

python
# application/level/views.py
class LevelAddView(PermissionRequired, View):
    permission_required = ("sys:level:add",)

    def post(self, request):
        form = LevelForm(parse_request_body(request))
        if not form.is_valid():
            return R.failed(msg=regular.get_err(form))
        # 保存数据...
        return R.ok(msg="添加成功")

自动验证

form.is_valid() 自动完成参数验证。验证失败时通过 regular.get_err(form) 提取错误信息:

json
{"code": 1, "data": null, "msg": "职级名称不能为空", "ok": false}

error_messages 自定义

Django Form 支持通过 error_messages 自定义中文错误提示:

python
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'realname', 'mobile']
        error_messages = {
            'username': {
                'required': '用户名不能为空',
                'max_length': '用户名不能超过30个字符',
            },
            'realname': {
                'required': '姓名不能为空',
            },
            'mobile': {
                'required': '手机号不能为空',
                'invalid': '手机号格式不正确',
            },
        }

regular.get_err() 错误提取

utils/regular.py 中的 get_err() 函数从 Form 对象中提取所有错误信息:

python
# utils/regular.py
def get_err(form):
    """
    获取表单错误文本

    从Django表单对象中提取所有错误信息,并将其合并为单个字符串。
    多个错误用'/'分隔。

    使用示例:
        form = UserForm(request.POST)
        if not form.is_valid():
            error_msg = get_err(form)
            return R.failed(msg=error_msg)
    """
    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

错误格式示例:

python
# 单个错误
"职级名称不能为空"

# 多个错误
"职级名称不能为空/排序不能为空"

字段约束

Django Form 提供丰富的字段约束:

约束说明示例
required是否必填forms.CharField(required=True)
max_length字符串最大长度forms.CharField(max_length=150)
min_length字符串最小长度forms.CharField(min_length=1)
min_value最小值forms.IntegerField(min_value=0)
max_value最大值forms.IntegerField(max_value=99999)

唯一性校验

在 service 层查询数据库校验唯一性:

python
# application/level/services.py
def add_level(request):
    data = parse_request_body(request)
    form = LevelForm(data)

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

    # 唯一性校验
    name = data.get('name')
    if Level.objects.filter(name=name, is_delete=False).exists():
        return R.failed("职级名称不能重复")

    # 保存数据...
    return R.ok(msg="添加成功")

parse_request_body

项目提供 parse_request_body() 工具函数,统一处理请求体解析:

python
# utils/common.py
def parse_request_body(request):
    """
    解析请求体,支持 JSON 和表单数据

    Args:
        request: Django 请求对象

    Returns:
        dict: 请求参数字典
    """
    try:
        return json.loads(request.body.decode('utf-8'))
    except:
        return request.POST.dict()

总结

参数验证模块具备以下特点:

1. Django ModelForm:类型安全、自动解析请求体
2. 中文错误:error_messages 自定义中文提示
3. regular.get_err():统一提取错误信息,多个错误用 / 分隔
4. 唯一性校验:在 service 层查询数据库,确保字段唯一性
5. parse_request_body:统一处理 JSON 和表单数据

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