orm表单的功能
- 准备数据、重构数据,以便下一步提交。
- 为数据创建HTML 表单
- 接收并处理客户端提交的表单和数据
普通字段详解:
布尔值 checkbox
charFied input()
ChoiceField (select标签)
DateField Dateinput 标签
emailField EaillInput
FileField
ImageField
MultipleChoiceField (select标签 multiple)
处理关系的字段:
两个字段可用于表示模型之间的关系:ModelChoiceField和ModelMultipleChoiceField。这两个字段都需要单个queryset参数,用于创建字段的选择。
ModelChoiceField
ModelMultipleChoiceField
表单里choice用的数据库里数据时不会实时更新。所以需要将choice放到init里,每次使用都执行一遍:
示例
字段的核心参数:
required
f = forms.CharField(required=False)
默认为True。label
>>> from django import forms>>> class CommentForm(forms.Form):... name = forms.CharField(label='Your name')... url = forms.URLField(label='Your Web site', required=False)... comment = forms.CharField()>>> f = CommentForm(auto_id=False)>>> print(f)Your name:Your Web site:Comment:
error_messages:
error_messages 参数让你覆盖字段引发的异常中的默认信息。传递的是一个字典,其键为你想覆盖的错误信息
has_changed():方法用于决定字段的值是否从初始值发生了改变。返回True 或False
字段数据:
不管表单提交的是什么数据,一旦通过调用is_valid() 成功验证(is_valid() 返回True),验证后的表单数据将位于form.cleaned_data 字典中。
from django.core.mail import send_mailif form.is_valid(): subject = form.cleaned_data['subject'] message = form.cleaned_data['message'] sender = form.cleaned_data['sender'] cc_myself = form.cleaned_data['cc_myself'] recipients = ['info@example.com'] if cc_myself: recipients.append(sender) send_mail(subject, message, sender, recipients) return HttpResponseRedirect('/thanks/')
重写验证方法:
# 自定义方法(局部钩子),密码必须包含字母和数字 def clean_password(self): if self.cleaned_data.get('password').isdigit() or self.cleaned_data.get('password').isalpha(): raise ValidationError('密码必须包含数字和字母') else: return self.cleaned_data['password'] def clean_valid_code(self): # 检验验证码正确;之前生成的验证码保存在了了session中 if self.cleaned_data.get('valid_code').upper() == self.request.session.get('valid_code'): return self.cleaned_data['valid_code'] else: raise ValidationError('验证码不正确') # 自定义方法(全局钩子, 检验两个字段),检验两次密码一致; def clean(self): if self.cleaned_data.get('password') != self.cleaned_data.get('password2'): raise ValidationError('密码不一致') else: return self.cleaned_data # 注意,上面的字典取值用get, 因为假如在clean_password中判断失败,那么没有返回值,最下面的clean方法直接取值就会失败s
使用表单模:
- { { form.as_table }} 以表格的形式将它们渲染在<tr> 标签中
- { { form.as_p }} 将它们渲染在<p> 标签中
- { { form.as_ul }} 将它们渲染在<li> 标签中
手工渲染字段:{ { form.name_of_field }
{ { form.non_field_errors }}{ { form.subject.errors }} { { form.subject }}{ { form.message.errors }} { { form.message }}{ { form.sender.errors }} { { form.sender }}{ { form.cc_myself.errors }} { { form.cc_myself }}
渲染表单的错误信息:{ { form.name_of_field.errors }}
迭代表单的字段:{ { field }} 包含所有有用的属性
{% for field in form %}{ { field.errors }} { { field.label_tag }} { { field }}{% endfor %}
可重用的表单模板:
在表单保存到单独的模块,用includ标签来重用
{% include "form_snippet.html" %}# In form_snippet.html:{% for field in form %}{ { field.errors }} { { field.label_tag }} { { field }}{% endfor %}
widgets窗口小部件
widgets.attr 设置标签属性
class CommentForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'})) url = forms.URLField() comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))>>> f = CommentForm(auto_id=False)>>> f.as_table()Name:Url:Comment:
生成form field对象,指定类型
from django.form impor widgets,fieldsxxxx = fields.CharField(widget=widgets.Textarea)