django带有一个form库,django.forms。将要处理的HTML的<Form>定义一个form类,放到一个文件中:forms.py文件中。
from django import forms class Login(forms.Form): username = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control','placeholder':'请输入用户名'})) email = forms.EmailField() ip = forms.GenericIPAddressField(error_messages={'required':('IP不能为空'),'invalid':('格式错误')})
每一个字段默认都是必填,要使email成为可选项,需要指定required=False;forms把每个字段的显示逻辑都分离到一部组件(widget)中,可以使用widget=forms.Textarea替换掉默认组件。message = forms.CharField(widget=forms.Textarea)
在视图中使用Form对象
from app04 import forms import json def index(request): ret = {'data':None,'error':''} obj = forms.Login() ret['data']=obj if request.method == 'POST': checkForm = forms.Login(request.POST) #绑定数据到表单 checkresult = checkForm.is_valid() if checkresult: print(checkForm.cleaned_data)
print(checkForm.cleaned_data['username']) else: errorsObj = checkForm.errors
# firstErrorMsg = checkForm.errors.as_data() firstErrorMsg = checkForm.errors.as_json() ErrorMsg = json.loads(firstErrorMsg).values() EndMsg = list(ErrorMsg)[0][0]['message'] ret['error'] = EndMsg ret['data'] = checkForm #出现错误后,不会清空原来的输入 return render_to_response('login_form.html',ret) return render_to_response('login_form.html',ret)
对于绑定的表单可以使用
is_valid() 方法来执行验证并返回一个表示数据是否合法的布尔值
cleaned_data 包含表单中定义的合法字段
errors属性可以获得错误信息的一个字典,这个我暂时没有测试出来,有点问题。
as_data()方法返回一个字典,它映射字段到原始的ValidationError实例,当输入错误的IP格式时,
{'ip': [ValidationError(['格式错误'])]}
as_json()返回JSON序列化后的错误,当输入错误的IP格式时返回
{"ip": [{"message": "u683cu5f0fu9519u8bef", "code": "invalid"}]}
login_form.html中:
<form action="/app04/index/" method="POST"> 用户名:{{ data.username }} 邮箱:{{ data.email }} IP: {{data.ip}} <!-- {{ form.as_table }} --> <input type="submit" value="提交"> <div> {{ error }} </div> </form>
表单渲染选项
{{ form.as_table }}以表格的形式将它们渲染在<tr>标签中
{{ form.as_p }}以表格的形式将它们渲染在<p>标签中
{{ form.as_ul }}以表格的形式将它们渲染在<li>标签中
需要自己提供<table>或<ul>元素
效果