1.构建一个Django表单的步骤:
(1)定义一个Form类
#forms.py
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name', max_length=100)
(2)定义一个视图函数
#views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NameForm
def get_name(request):
if request.method == 'POST':
#如果表单提交的是POST请求,视图将创建一个表单实例
#并使用请求中的数据填充它(即绑定数据至表单)
form = NameForm(request.POST)
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
#如果访问视图的是一个GET请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。
#这是我们在第一次访问该URL时预期发生的情况。
else:
form = NameForm()
#如果之前的表单验证没通过,也将使用绑定数据的表单重新渲染模板。
return render(request, 'name.html', {'form': form})
Form 的实例具有一个is_valid() 方法,它为所有的字段运行验证的程序。当调用这个方法时,如果所有的字段都包含合法的数据,它将:
- 返回True
- 将表单的数据放到cleaned_data 属性中。
(3)定义一个视图模板
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
- Django 原生使用“csrf_token” 模板标签支持简单易用的跨站请求伪造的防护。
- 如果你的表单包含URLField、EmailField 或其它整数字段类型,Django 将使用url、email和 number 这样的HTML5 输入类型。默认情况下,浏览器可能会对这些字段进行它们自身的验证,这些验证可能比Django 的验证更严格。如果想禁用这个行为,设置form 标签的novalidate 属性,或者指定一个不同的字段,如TextInput。
2.表单字段
- 每个表单字段都有一个对应的Widget 类,它对应一个HTML 表单Widget,例如<input type="text">。在大部分情况下,字段都具有一个合理的默认Widget。例如,默认情况下,CharField 具有一个TextInput Widget,它在HTML 中生成一个<input type="text">。如果你需要<textarea>,在定义表单字段时你应该指定一个合适的Widget,例如 message = forms.CharField(widget=forms.Textarea)
3.表单数据
- 验证后的表单数据将位于form.cleaned_data 字典中。这些数据已经转换好为Python 的类型。
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
4.表单模板
- {{form.as_table}} 以表格的形式将它们渲染在<tr> 标签中;{{ form.as_p }} 将它们渲染在<p> 标签中;{{ form.as_ul }} 将它们渲染在<li> 标签中。注意,必须自己提供<table> 或<ul> 元素。