Django带有一个form库,成为django.forms,这个库可以处理HTML表单显示以及验证。表单框架最主要的用法是为每一个将要处理的HTML的‘’定义一个类。
在books中专门创建一个关于forms的文件,forms.py
from django import forms
class ContactForm(forms.Form):
subject=forms.CharField()
#required=False表示该字段是选填的
email=forms.EmailField(required=False)
message=forms.CharField()
>>> from books.forms import ContactForm
>>> f=ContactForm()
>>> f
>>> print(f)
默认输出按照HTML的
格式,但是开闭标记没有包含于输出当中。这样你就可以添加额外的行或者自定义格式。>>>
#使用is_valid()方法,如果合法则返回True
f=ContactForm({'subject':'hello','email':'[email protected]','message':'you will success'})
>>> f.is_valid()
True
#如果不合法返回False,可以查看每个字段的出错信息
>>> f=ContactForm({'subject':'','email':'[email protected]','message':'you will success'})
>>> f.is_valid()
False
>>> f['subject'].errors
['This field is required.']
>>> f['email'].errors
[]
>>> f=ContactForm({'subject':'hello','email':'[email protected]','message':'you will success'})
>>> f.is_valid()
True
>>> f.cleaned_data
{'subject': 'hello', 'email': '[email protected]', 'message': 'you will success'}
contact form只涉及字符串类型,它们会被清理成Unicode对象,如果使用整数或日期型,form方法会确保方法使用合适的Python整数型或datetime.data型对象。
在视图中使用Form对象
def contact(request):
if request.method=='POST':
form=ContactForm(request.POST)
if form.is_valid():
cd=form.cleaned_data
send_mail(
cd['subject'],
cd['message'],
cd.get('email','[email protected]'),
['[email protected]'],
)
return HttpResponseRedirect('/contact/')
else:
form=ContactForm()
return render_to_response('contact_form.html', {'form':form})
templates/contact_form.html
Contact_us
{% if form.errors %}
Please corrent the error{{ form.errors|pluralize }} below.
{% endif %}
在urls.py中添加映射关系然后运行服务。
改变字段显示
class ContactForm(forms.Form):
subject=forms.CharField()
#required=False表示该字段是选填的
email=forms.EmailField(required=False)
#改变了字段类型
message=forms.CharField(widget=forms.Textarea)
forms框架把每一个字段的显示逻辑部分分离到一组部件(widget)中。每一个字段类型都拥有一个默认的部件,可以替换掉默认部件或者提供一个定义的部件。field表现校验逻辑,而部件表示显示逻辑。
设置字段内容长度
class ContactForm(forms.Form):
subject=forms.CharField(max_length=100,min_length=50)
#required=False表示该字段是选填的
email=forms.EmailField(required=False)
message=forms.CharField(widget=forms.Textarea)
设置初始值
def contact(request):
if request.method=='POST':
form=ContactForm(request.POST)
if form.is_valid():
cd=form.cleaned_data
send_mail(
cd['subject'],
cd['message'],
cd.get('email','[email protected]'),
['[email protected]'],
)
return HttpResponseRedirect('/contact/')
else:
form=ContactForm(
initial={'subject':'you will success'}
)
return render_to_response('contact_form.html', {'form':form})
传入初始值数据和传入数据绑定表单是有区别的,如果仅传入初始值数据,表但是unbound的,那意味着它没有错误消息。
自定义校验规则
Django的form系统会自动寻找匹配的函数方法,该方法以clean_开有,并以字段名结束。如果有这样的方法,他将在校验时被调用。
class ContactForm(forms.Form):
subject=forms.CharField(max_length=100,min_length=50)
#required=False表示该字段是选填的
email=forms.EmailField(required=False)
message=forms.CharField(widget=forms.Textarea)
def clean_message(self):
message=self.cleaned_data['message']
num_word=len(message.split())
if num_word < 4:
raise forms.ValidationError("Not enough words")
return message
指定标签
class ContactForm(forms.Form):
subject=forms.CharField(max_length=100,min_length=50)
#required=False表示该字段是选填的
email=forms.EmailField(required=False,label='Your e-mail')
message=forms.CharField(widget=forms.Textarea)