Files
djangoadmin-wiki/DjangoAdmin_Django_EleVue/zh/volume2/form.md
T
2026-09-13 17:33:13 +08:00

301 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 表单验证(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.ModelForm` | Django 内置 | 自动绑定模型、字段验证、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
```
例如,如果 `name` 和 `type` 都验证失败,返回的错误信息为:
```
案例名称不能为空/案例类型不能为空
```
## 在 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
# ... 创建记录
```
## 常用验证规则
| 字段类型 | 验证参数 | 说明 |
|:----|:----|:----|
| 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()` 提取错误信息,多个错误用 `/` 分隔。