所有的form类都是django.forms.Form的子类。

from django import forms 
 
class NameForm(forms.Form): 
 
your_name = forms.CharField(label='Your name', max_length=100) 
 
在HTML页面中使用{{form}}标签展开后显示如下: 
 
<label for="your_name">Your name: </label> 
 
<input id="your_name" type="text" name="your_name" maxlength="100" required /> 
 
注意:这没有包含<form>标签和submit按钮,需要单独在模板里面添加进去 
 
在views里面的使用方法如下所示: 
 
views.py 
 
from django.shortcuts import render 
 
from django.http import HttpResponseRedirect 
 
from .forms import NameForm 
 
def get_name(request): 
 
# if this is a POST request we need to process the form data 
 
if request.method == 'POST': 
 
# create a form instance and populate it with data from the request: 
 
form = NameForm(request.POST) 
 
# check whether it's valid: 
 
if form.is_valid(): 
 
# process the data in form.cleaned_data as required 
 
# ... 
 
# redirect to a new URL: 
 
return HttpResponseRedirect('/thanks/') 
 
# if a GET (or any other method) we'll create a blank form 
 
else: 
 
form = NameForm() 
 
return render(request, 'name.html', {'form': form}) 
 

name.html的内容如下所示: 
 
<form action="/your-name/" method="post"> 
 
{% csrf_token %} 
 
{{ form }} 
 
<input type="submit" value="Submit" /> 
 
</form> 
 
如果form.is_valid通过的话能够从cleaned_data属性从获得验证过的值。其中cleaned_data是类似python字典的类型,具体见下面例子。下面代码展示了如何通过验证form的值并取出,不过有特殊需求的话也能直接从request.POST中直接取出错误的值。 
 
views.py 
 
from django.core.mail import send_mail 
 
if 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/') 
 

>>> data = {'subject': 'hello', 
 
... 'message': 'Hi there', 
 
... 'sender': 'foo@example.com', 
 
... 'cc_myself': True} 
 
>>> f = ContactForm(data) 
 
这个创建了一个buond的form,注意: 
 
>>> f = ContactForm({}) 
 
>>> f.is_bound 
 
True 
 
传递一个空字典同样也创建一个bound的form。 
 

form也提供了其他html输出的标签: 
 
{{ form.as_table }} 提供了<tr>包围标签 
 
{{ form.as_p }} 提供了<p>包围标签 
 
{{ form.as_ul }} 提供了<li>标签 
 
例如 {{ form.as_p }}展开如下所示: 
 
<p><label for="id_subject">Subject:</label> 
 
<input id="id_subject" type="text" name="subject" maxlength="100" required /></p> 
 
<p><label for="id_message">Message:</label> 
 
<textarea name="message" id="id_message" required></textarea></p> 
 
<p><label for="id_sender">Sender:</label> 
 
<input type="email" name="sender" id="id_sender" required /></p> 
 
<p><label for="id_cc_myself">Cc myself:</label> 
 
<input type="checkbox" name="cc_myself" id="id_cc_myself" /></p> 
 
这里也并没有提供<table>和<ul>标签,需要自己添加进去。 
 

虽然django可以使用{{form}}自动展开,我们同样可以手动控制输出的格式,例如: 
 
{{ form.non_field_errors }} 
 
<div class="fieldWrapper"> 
 
{{ form.subject.errors }} 
 
<label for="{{ form.subject.id_for_label }}">Email subject:</label> 
 
{{ form.subject }} 
 
</div> 
 
<div class="fieldWrapper"> 
 
{{ form.message.errors }} 
 
<label for="{{ form.message.id_for_label }}">Your message:</label> 
 
{{ form.message }} 
 
</div> 
 
<div class="fieldWrapper"> 
 
{{ form.sender.errors }} 
 
<label for="{{ form.sender.id_for_label }}">Your email address:</label> 
 
{{ form.sender }} 
 
</div> 
 
<div class="fieldWrapper"> 
 
{{ form.cc_myself.errors }} 
 
<label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label> 
 
{{ form.cc_myself }} 
 
</div> 
 
label标签可以使用label_tag单独生成: 
 
<div class="fieldWrapper"> 
 
{{ form.subject.errors }} 
 
{{ form.subject.label_tag }} 
 
{{ form.subject }} 
 
</div> 
 
输入错误格式: 
 
{% if form.subject.errors %} 
 
<ol> 
 
{% for error in form.subject.errors %} 
 
<li><strong>{{ error|escape }}</strong></li> 
 
{% endfor %} 
 
</ol> 
 
{% endif %} 
 

单独处理隐藏标签,比如隐藏标签的错误不需要被显示出来: 
 
{# Include the hidden fields #} 
 
{% for hidden in form.hidden_fields %} 
 
{{ hidden }} 
 
{% endfor %} 
 
{# Include the visible fields #} 
 
{% for field in form.visible_fields %} 
 
<div class="fieldWrapper"> 
 
{{ field.errors }} 
 
{{ field.label_tag }} {{ field }} 
 
</div> 
 
{% endfor %}