今天将表单这一章看完了,感觉稀里糊涂的,在此做个总结:
1.引入:from django import forms
2.自定义表单类:
<span style="font-size:18px;">#form.py
class ContactForm(forms.form):
subject=forms.CharField(max_length="20")
email = forms.EmailField(required=False)
#自定义校验函数:
#以clean_开头,以字端名称结束
#此类方法将在默认校验后自动执行
def clean_subject(self):
subject=self.cleaned_data['subject']
num_words=len(subject.split())
if num_words>20:
raise forms.ValidationError(' 敢不敢再长点?')
return subject #若不返回,则用户原来输入的将丢失</span>
3.表单类的说明:
创建表单类对象:
1⃣️:f=ContactForm()
说明:创建不带任何数据的纯表单
2⃣️:f=ContactForm(request.GET或request.POST)
说明:创建带有数据的表单。ps:仅当提交表单内容后,request.GET/POST才有 效,即request.method才有值
表单类的方法:
1⃣️ f.as_table()/as_ul()/as_p:返回以表格/列表/段落,形式定义的表单的html,其中
<table>,<ul>,<form>的始末标记不再其中,这样就可以自定义添加一些内容:
以table形式的输出:
<tr><th><label for="id_subject">Subject:</label></th><td><input type="text" name="subject" id="id_subject" /></td></tr>
<tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr>
<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="me
以列表形式的输出:
<li><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></li> <li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li> <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>
以段落形式的输出:
<p><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></p> <p><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></p> <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>
2⃣️.f['subject']:显示指定字段的html,如下
<input type="text" name="subject" id="id_subject" />
注意:在html中要使用f.subject而不是f['subject'],否则在运行时会出现错误提示这类没有这个属性。
3⃣️.f.errors:得到这个表单的所有输入错误信息的一个字典:
>>> f.errors {'message': [u'This field is required.']}
4⃣️.f['subject'].errors:返回该字段输入的错误信息的一个列表,若没有错误信息,则返回空列表,在html中形式为f.subject.errors:
f['subject'].errors
[]5⃣️f.is_vaild():
返回布尔,判断所输入的数据是否全部合法
6⃣️ f.cleaned_data:
返回一个包含字段名称和相应的值的字典,该方法把它们转换成相应的Python类型数据,比如字符串将被转换为Unicode对象,整形将被转化为python的整形
f.cleaned_data
{message': uNice site!, email: uadrian@example.com, subject: uHello}
4.定义相应的html文件:
有了上面的基础,我们就可以定义view.py和html 文件了。
我的html文件:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>联系人</title>
</head>
<body>
{% if form.errors %}
<p style="color:red">
Please correct the flow error{{ form.errors|pluralize }}
</p>
{% endif %}
<form action="" method="post">
<table border="1">
<tr><td><lable for="id_subjec">subject</lable></td>
<td>{{ form.subject}}</td>
<td>{{ form.subject.errors }}</td>
</tr>
<tr><td><lable for="id_message">message</lable></td>
<td>{{ form.message}}</td>
<td>{{ form.message.errors }}</td>
</tr>
<tr><td><lable for="id_email">email</lable></td>
<td>{{ form.email}}</td>
<td>{{ form.email.errors }}</td>
</tr>
</table>
<input type="submit" value="submit">
</form>
</body>
</html>
5.我的视图代码:
def new_contact(request):
if request.method=='POST':
form=contact_form(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('/conatct/thaks')
else:
return render_to_response('contact_form_new.html',{'form':form})
else:
form=contact_form(
initial={'subject':'i love you'}
)
return render_to_response('contact_form_new.html',{'form':form})