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

244 lines
5.9 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, 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 类继承
```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()` 提取错误信息,多个错误用 `/` 分隔。