?
在templates中添加contact_form.html :
?
Contact us
{% if errors %}- {% for error in errors %}
- {{ error }}
- {% endfor %}
?
这个例子看起来杂乱,解决方法看下面用forms。
?
5. from类
?
上面的那个例子,看起来杂乱,并且容易出错。
Django带有一个form库,称为django.forms,这个库可以处理HTML表单显示以及验证。
?
新建 forms.py 加入
?
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField()
email = forms.EmailField(required=False)
message = forms.CharField()
?
很像模块中用的语法。默认是每个字段必填的,如果要是可以不填的要指定required=False,就像上面的email字段一样。
?
来看看forms类到底是什么:它做的第一个是就是将自己显示成HTML
?
>>> from contact.forms import ContactForm >>> f = ContactForm() >>> print f
?
默认是按照
现实输出的,还可以:?
?
>>> print f.as_ul()
- >>> print f.as_p()
?
?
还可以这样显示
?
>>> print f['subject']?
?
forms对象做的第二件事是校验数据。现在先添加数据:
?
>>> f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'}) >>>
?
一旦对一个forms对象实体赋值,就可以得到一个绑定的form:
?
>>> f.is_bound True >>>?
?
还可以验证数据是否合法
?
>>> f.is_valid() True >>>?
如果合法为True。如果不合法为False。如:如果subject或者,essage为空。f.is_valid()就会返回False
?
也可以查看每个字段的error
?
>>> f = ContactForm({'subject': 'Hello', 'message': ''}) >>> f['message'].errors [u'This field is required.'] >>> f['subject'].errors [] >>>
?
还可以通过errors属性查看错误
?
>>> f.errors {'message': [u'This field is required.']} >>>
?
?
如果forms合法,他就有一个cleaned_data属性,将数据转化成Python类型数据,存放在cleaned_data中。
例如:如果是字符串就会被清理成Unicode对象,整数会被清理成Python整数,日期清理成datetime.date型对象
?
>>> f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'}) >>> f.is_valid() True >>> f.cleaned_data {'message': u'Nice site!', 'email': u'adrian@example.com', 'subject': u'Hello'}?
?
?
6. 在视图中使用Form对象
?
例子:
?
view.py?
from django.shortcuts import render from contact.forms import ContactForm from django.http import HttpResponseRedirect from django.core.mail import send_mail 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', 'noreply@example.com'), ['siteowner@example.com'], ) return HttpResponseRedirect('/contact/thanks/') else: form = ContactForm() return render(request, 'contact_form.html', {'form': form})?
?
contact_form.html
?
{{ form.as_table }}
{% csrf_token %}
?
上面的例子有个缺陷,message这个表单变成了 input type=“text”。
我们可以通过设置widget来修改它:
?
from django import forms class ContactForm(forms.Form): subject = forms.CharField() email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea)
?
还可以设置最大长度
设置max_length
?
from django import forms class ContactForm(forms.Form): subject = forms.CharField(max_length=20) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea)
?
设置初始值:
?
在view.py中ContectForm中添加 initial 参数:
?
from django.shortcuts import render from contact.forms import ContactForm from django.http import HttpResponseRedirect from django.core.mail import send_mail def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): cd