Python 现代开发学习笔记

(十一)Form 的绑定与 cleaned_data

浏览器提交文本,业务要使用布尔值、整数和合格字符串。先用普通 forms.Form 观察转换,暂时不保存模型。

# 项目文件:demos/simple_form.py
# 先比较未绑定表单与绑定表单,再查看验证后的 cleaned_data 和字段错误。
import django
from django import forms
from django.conf import settings

settings.configure(SECRET_KEY="temporary-demo-key", USE_I18N=False, INSTALLED_APPS=[])
django.setup()


class DraftForm(forms.Form):
    title = forms.CharField(max_length=100)
    finished = forms.BooleanField(required=False)
    pages = forms.IntegerField(min_value=1)


for data in [
    None,
    {},
    {"title": "  Python Web  ", "finished": "on", "pages": "3"},
    {"title": "", "pages": "abc"},
]:
    form = DraftForm(data)
    print("绑定", form.is_bound, "通过", form.is_valid())
    print(form.cleaned_data if form.is_valid() else list(form.errors))

Form(None) 没有绑定数据,适合第一次显示空表单;Form({}) 已经绑定空提交,会对必填字段给出错误。is_valid() 执行转换与校验,通过后使用 cleaned_data,不再从原始 POST 中猜字段含义。

书名去空白、"3" 转为整数,勾选值转为 True;错误数据在 errors 中按字段保存。视图写 request.POST if request.method == "POST" else None,因此空 POST 也会被正确识别为一次需要检查的提交。

先区分没有提交的 None 与已提交的空字典,再把书名数字和勾选文本逐字段转换,成功形成 cleaned_data,失败形成字段 errors

笔记正文与全部题解 · Ctrl / ⌘ K