Become a sponsor

参数验证
使用 Django ModelForm 进行请求参数验证。所有请求体参数通过 Django Form 定义,视图中调用 form.is_valid() 自动验证,验证失败通过 regular.get_err() 提取错误信息返回前端。
# 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个字符',
},
}# 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) 提取错误信息:
{"code": 1, "data": null, "msg": "职级名称不能为空", "ok": false}Django Form 支持通过 error_messages 自定义中文错误提示:
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'realname', 'mobile']
error_messages = {
'username': {
'required': '用户名不能为空',
'max_length': '用户名不能超过30个字符',
},
'realname': {
'required': '姓名不能为空',
},
'mobile': {
'required': '手机号不能为空',
'invalid': '手机号格式不正确',
},
}utils/regular.py 中的 get_err() 函数从 Form 对象中提取所有错误信息:
# 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错误格式示例:
# 单个错误
"职级名称不能为空"
# 多个错误
"职级名称不能为空/排序不能为空"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 层查询数据库校验唯一性:
# 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() 工具函数,统一处理请求体解析:
# 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 和表单数据