django-forms
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDjango Forms
Django表单
Philosophy
设计理念
- Prefer ModelForm for model-backed forms
- Keep validation logic in forms, not views
- Always handle and display form errors
- Use when you need to modify the instance before saving
commit=False
- 优先为模型关联表单使用ModelForm
- 将验证逻辑放在表单中,而非视图
- 始终处理并显示表单错误
- 当需要在保存前修改实例时,使用
commit=False
Validation
验证
Field-level ():
clean_<field>- Validate and transform a single field
- Return the cleaned value or raise
ValidationError - Use for: format checks, uniqueness, normalization
Cross-field ():
clean- Call first
super().clean() - Access multiple fields via
cleaned_data - Use for field-specific errors
self.add_error(field, message) - Use for: password confirmation, conditional requirements
字段级验证 ():
clean_<field>- 验证并转换单个字段
- 返回清理后的值或抛出
ValidationError - 适用场景:格式检查、唯一性验证、标准化处理
跨字段验证 ():
clean- 先调用
super().clean() - 通过访问多个字段
cleaned_data - 使用添加字段专属错误信息
self.add_error(field, message) - 适用场景:密码确认、条件性要求验证
View Integration
视图集成
- Check explicitly
request.method - Instantiate form with for POST, empty for GET
request.POST - Use to set additional fields (e.g., author)
form.save(commit=False) - Return redirect on success, re-render with form on error
HTMX handling:
- Check for HTMX requests
request.headers.get("HX-Request") - Return partial template on success/error for HTMX
- Use header to notify other components
HX-Trigger
- 显式检查
request.method - POST请求时用实例化表单,GET请求时使用空表单
request.POST - 使用设置额外字段(例如:作者)
form.save(commit=False) - 成功时返回重定向,错误时重新渲染带表单的页面
HTMX处理:
- 检查判断是否为HTMX请求
request.headers.get("HX-Request") - 成功/错误时为HTMX返回部分模板
- 使用通知其他组件
HX-Trigger
Templates
模板
- Display for cross-field errors
form.non_field_errors - Display for each field
field.errors - Use partial templates () for HTMX responses
_form.html - Include loading indicator with
hx-indicator
- 显示以展示跨字段错误
form.non_field_errors - 为每个字段显示
field.errors - 使用部分模板()作为HTMX响应
_form.html - 通过添加加载指示器
hx-indicator
Widgets
小部件(Widgets)
- Override in dict
Meta.widgets - Set HTML attributes via parameter
attrs - Common: ,
Textarea(attrs={"rows": 5})DateTimeInput(attrs={"type": "datetime-local"})
- 在字典中覆盖默认小部件
Meta.widgets - 通过参数设置HTML属性
attrs - 常见示例:、
Textarea(attrs={"rows": 5})DateTimeInput(attrs={"type": "datetime-local"})
Formsets
表单集(Formsets)
- Use for related model collections
inlineformset_factory - Validate both form and formset:
form.is_valid() and formset.is_valid() - Pass for editing existing parent objects
instance
- 使用处理关联模型集合
inlineformset_factory - 同时验证表单和表单集:
form.is_valid() and formset.is_valid() - 编辑现有父对象时传递参数
instance
Pitfalls
常见陷阱
- Validating in views instead of forms
- Silently redirecting without checking
is_valid() - Forgetting when setting related fields
commit=False - Not displaying form errors to users
- 在视图中而非表单中进行验证
- 未检查就直接重定向
is_valid() - 设置关联字段时忘记使用
commit=False - 未向用户显示表单错误