Python · 2 分钟阅读
表单系统:Form 与 ModelForm
Django 表单系统把"渲染 HTML + 校验数据 + 清理数据"三件事封装成可复用的类。
Form 对象
# post/forms.py
from django import forms
class TopicSearchForm(forms.Form):
title = forms.CharField(label="标题", max_length=100)
特性:
- 字段类型 → 默认控件 + 默认校验规则
is_valid()一键校验cleaned_data拿到清洗后的数据- 模板中
{{ form }}直接渲染,或{{ form.as_p }}/{{ form.as_ul }}
ModelForm
直接基于 Model 生成表单,字段、控件、约束一并继承:
class TopicModelForm(forms.ModelForm):
class Meta:
model = Topic
fields = ("title", "content") # 也可 exclude
labels = {"title": "标题", "content": "内容"}
help_texts = {"title": "请输入简洁的标题"}
widgets = {
"content": forms.Textarea(attrs={"rows": 6}),
}
editable=False的字段(主键、自动时间戳)不会出现在 ModelForm 中。
视图配合
def topic_create(request):
if request.method == "POST":
form = TopicModelForm(request.POST)
if form.is_valid():
topic = form.save(commit=False)
topic.user = request.user
topic.save()
return redirect("post:topic_detail", pk=topic.id)
else:
form = TopicModelForm()
return render(request, "post/topic_form.html", {"form": form})
模板:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交</button>
</form>
常用 Meta 选项
| 选项 | 说明 |
|---|---|
model |
关联的 Model |
fields / exclude |
二选一 |
widgets |
字段 → 控件映射 |
labels |
字段标签 |
help_texts |
字段帮助文字 |
field_classes |
自定义字段类型 |
error_messages |
自定义错误提示 |
表单 vs ModelForm
| 场景 | 选择 |
|---|---|
| 与 Model 字段高度重合 | ModelForm |
| 复杂业务字段(验证码、确认密码) | Form |
| 混合 | 在 Form 中嵌入 ModelForm |