R / Richie全部文章 ↑

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