-
Django进修笔记(9):Django的表单(或类似表单)(下)
添加时间:2013-5-14 点击量:一、概述
Django带有一个form库,称为django.forms。为每一个要处理惩罚的HTML的<form>定义一个Form类,习惯写在forms.py中。
第一次用,感触感染Django真的很强大,强大到变态。
1 django import forms
2
3 class ContactForm(forms.Form):
4 subject = forms.CharField()
5 email = forms.EmailField(required=False)
6 message = forms.CharField()它的语法:
跟模块差不久不多,每一个字段都默认是必填。要使email成为可选项,我们须要指定required=False。
二、工作流程
1、将本身显现成HTML
默认输出遵守HTML的<`` table`` >格局
1 >>> contact.forms import ContactForm
2 >>> f = ContactForm()
3 >>> print f还有其他格局:f.as_ul()、f.as_p()
请重视,标签<table>、<ul>、<form>的开闭合标识表记标帜没有包含于输出傍边,如许你就可以添加额外的行或者自定义格局。
还可以显示单个:f[subject]
2、校验数据
>>> f = ContactForm({subject: Hello, email: adrian@example.com, message: Nice site!})
is_bound属性:一旦你对一个Form实体赋值,你就获得了一个绑定form:
1 >>> f.is_bound
2 Trueis_valid()办法:验证它的数据是否合法。
errors属性:供给了一个字段与错误消息相映射的字典表
cleaned_data属性:在数据合法的景象下,它包含干净的提交数据的字典
三、在视图中应用
1 forms.py
2 #用户注册
3 class RegistrationForm(forms.Form):
4 username = forms.CharField(label=用户名,max_length=30)
5 email = forms.EmailField(label=电子邮件)
6 password1 = forms.CharField(label=暗码,widget=forms.PasswordInput())
7 password2 = forms.CharField(label=确认暗码,widget=forms.PasswordInput())
8 pic = forms.ImageField(label=头像上传)
9 def clean_username(self):
10 验证用户输入的用户名的合法性
11 username = self.cleaned_data[username]
12 if not re.search(r^\w+¥, username):
13 raise forms.ValidationError(用户名中只能包含字母、数字和下划线)
14 try:
15 User.objects.get(username=username)
16 except ObjectDoesNotExist:
17 return username
18 raise forms.ValidationError(用户名已存在!)
19
20 def clean_email(self):
21 验证输入的电子邮件是否合法
22 email = self.cleaned_data[email]
23 try:
24 User.objects.get(email=email)
25 except ObjectDoesNotExist:
26 return email
27 raise forms.ValidationError(该邮箱已注册!)
28
29 def clean_password2(self):
30 验证用户两次输入的暗码一致性
31 if password1 in self.cleaned_data:
32 password1 = self.cleaned_data[password1]
33 password2 = self.cleaned_data[password2]
34 if password1 == password2:
35 return password2
36 raise forms.ValidationError(暗码不匹配)1 views
2 def register_page(request):
3 context={}
4 if request.method ==POST:
5 form = RegistrationForm(request.POST) #建树一个包含用户注册信息的RegistrationForm表单
6 if form.is_valid(): #验证合法
7 #按照用户提交的注册信息在用户信息表中建树一个新的用户对象
8 user = User.objects.create(
9 username = form.cleaned_data[username],
10 password = form.cleaned_data[password1],
11 email = form.cleaned_data[email],
12 )
13 return HttpResponseRedirect(/accounts/register/success/)
14 else:
15 #若是是直接调用该函数,则建树一个未绑定任何数据注册的表单对象
16 form = RegistrationForm()
17 variables = RequestContext(request,{form:form})
18 return render_to_response(registration/register.html,variables)四、字段设置
1、widget(部件的意思),如:
message=forms.CharField(widget=forms.Textarea) #显示成<`` textarea`` >
password = forms.CharField(label=暗码,widget=forms.PasswordInput()) #显示成暗码样式
forms框架把每一个字段的显示逻辑分别到一组部件(widget)中。 每一个字段类型都拥有一个默认的部件,我们也可以轻易地调换掉默认的部件,或者供给一个自定义的部件。
推敲一下Field类发挥解析 校验逻辑 ,而部件发挥解析 显示逻辑 。2、max_length设置最大长度3、设置初始值initial:初始的 、 最初的 的意思可以在创建Form实体时,应用initial参数所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
1 ......
2 else:
3 form=ContactForm()
4 initial={subject:I love you}请重视,传入 初始值 数据和传入数据以 绑定 表单是有区此外。 大差别是,若是仅传入 初始值 数据,表单是unbound的,那意味着它没有错误消息。
五、自定义校验规矩
1 django import forms
2
3 class ContactForm(forms.Form):
4 subject = forms.CharField(label=主题,max_length=100)
5 email = forms.EmailField(required=False)
6 message = forms.CharField(widget=forms.Textarea)
7
8 def clean_message(self):
9 message = self.cleaned_data[message]
10 num_words = len(message.split())
11 if num_words < 4:
12 raise forms.ValidationError(Not enough words!)
13 return message1、Django的form体系主动寻找匹配的函数办法,该办法名称以clean_开首,并以字段名称停止。 若是有如许的办法,它将在校验时被调用。
2、希罕地,clean_message()办法将在指定字段的默认校验逻辑履行 之后 被调用。(本例中,在必填CharField这个校验逻辑之后。)因为字段数据已经被项目组处理惩罚,所以它被从self.cleaned_data中提取出来了。同样,我们不必愁闷数据是否为空,因为它已经被校验过了。
3、我们简单地应用了len()和split()的组合来策画单词的数量。 若是用户输入字数不足,我们抛出一个forms.ValidationError型异常。这个异常的描述会被作为错误列表中的一项显示给用户。4、在函数的末尾显式地返回字段的值很是首要。 我们可以在我们自定义的校验办法中批改它的值(或者把它转换成另一种Python类型)。 若是我们忘怀了这一步,None值就会返回,原始的数据就丧失掉了。六、定制form设计<form action= method=post>
<div class=field>
{{ form.subject.errors }}
<label for=id_subject>Subject:</label>
{{ form.subject }}
</div>
<div class=field>
{{ form.email.errors }}
<label for=id_email>Your e-mail address:</label>
{{ form.email }}
</div>
<div class=field>
{{ form.message.errors }}
<label for=id_message>Message:</label>
{{ form.message }}
</div>
<input type=submit value=Submit>
</form>结果显示: