Django Forms 是一套面向 Django 表单处理的实践模式集合,重点在于把校验逻辑集中在表单层,而不是散落在视图中。
用途 该技能用于指导在 Django 项目中构建表单、实现数据校验、处理表单错误,以及配合 HTMX 完成异步表单提交。
核心理念
- 优先使用 ModelForm 处理基于模型的表单。
- 校验逻辑放在表单中,而不是视图中。
- 始终处理并向用户展示表单错误。
- 当需要在保存前修改实例时,使用 commit=False。
校验方式 字段级校验(clean_<field>):
- 校验并转换单个字段。
- 返回清洗后的值,或抛出 ValidationError。
- 适用场景:格式检查、唯一性、规范化。
跨字段校验(clean):
- 首先调用 super().clean()。
- 通过 cleaned_data 访问多个字段。
- 使用 self.add_error(field, message) 添加字段级错误。
- 适用场景:密码确认、条件性必填。
视图集成
- 显式检查 request.method。
- POST 请求时用 request.POST 实例化表单,GET 请求时使用空表单。
- 使用 form.save(commit=False) 设置额外字段(例如作者)。
- 成功时返回重定向,失败时重新渲染表单。
HTMX 处理
- 通过 request.headers.get("HX-Request") 判断是否为 HTMX 请求。
- 成功或出错时返回局部模板以响应 HTMX。
- 使用 HX-Trigger 响应头通知其他组件。
模板
- 使用 form.non_field_errors 展示跨字段错误。
- 使用 field.errors 展示每个字段的错误。
- 为 HTMX 响应使用局部模板(_form.html)。
- 通过 hx-indicator 加入加载指示器。
Widgets
- 在 Meta.widgets 字典中覆盖。
- 通过 attrs 参数设置 HTML 属性。
- 常见用法:Textarea(attrs={"rows": 5})、DateTimeInput(attrs={"type": "datetime-local"})。
Formsets
- 使用 inlineformset_factory 处理关联模型集合。
- 同时校验表单与 formset:form.is_valid() 和 formset.is_valid()。
- 编辑已有父对象时传入 instance。
常见陷阱
- 在视图中而不是表单中做校验。
- 未检查 is_valid() 就静默重定向。
- 设置关联字段时忘记使用 commit=False。
- 未向用户展示表单错误。
限制 该资料未提供具体的安装命令、依赖版本、收费信息或平台支持范围,这些内容暂未提供。