Django表单
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> 元素。