django表单

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

一、主要内容

1、服务端获取HttPRequest信息

1)url相关信息

2)HttpRequest.META中包含的键值对

3)HttpRequest中用户提交的信息

4)HttpRequest.GET:来自于<form>标签提交,或url查询字符串

一般只是从服务端获取信息

HttpRequest.POST:来自于<form>标签提交

可能修改服务端信息

5)action=““意味着表单将提交给与当前页面相同的URL

2、多参数校验

1)发邮件

2)重定向:我们应每次都给成功的POST请求做重定向。 这就是web开发的最佳实践。

原因:post成功后,直接重定向,不会造成重复向同一个页面post数据(返回同一个页面时,但参数要求不同)。

3)forms类只有绑定了才有error信息:

initial函数不绑定,构造函数传入数据才绑定

4)forms类中使用"clean_字段名()"方法,自定义数据校验规则

5)forms类结合CSS进行渲染

二、基础代码

1、主要结构

2、urls.py

fromdjango.conf.urlsimportpatterns, include, urlfromdjango.contribimportadmin

admin.autodiscover()

urlpatterns= patterns('',

(r'^contact_author/$','django_manage_app.views.contact_author'),

(r'^thanks/$','django_manage_app.views.thanks'),

)

3、views.py

#coding:utf8fromdjango.httpimportHttpResponseRedirectfromdjango.shortcutsimportrender_to_responsefromdjango_manage_app.formsimportContactFormdefcontact_author(request):ifrequest.method =='POST':#提交请求时才会访问这一段,首次访问页面时不会执行form =ContactForm(request.POST)ifform.is_valid():#说明各个字段的输入值都符合要求cd = form.cleaned_data#只有各个字段都符合要求时才有对应的cleaned_dataprintform.clean_message()printcd['subject']printcd['email']printcd['message']returnHttpResponseRedirect('/thanks/')else:#有部分字段不符合要求,会有error相关信息给加到form中去,需要覆盖掉printformprint'数据不符合要求'printform['subject'].errorsprintform['email'].errorsprintform['message'].errorselse:#首次访问该url时没有post任何表单form = ContactForm()#第一次生成的form里面内容的格式printformprintform.is_valid()#“首次访问”和“提交的信息不符合要求”时被调用returnrender_to_response('contact_author.html', {'form': form})defthanks(request):returnrender_to_response('thanks.html')

4、forms.py

#coding:utf8fromdjangoimportformsclassContactForm(forms.Form):

subject= forms.CharField(max_length=10,label='主题')#设置最大长度为10email = forms.EmailField(required=False,label='Email')#非必要字段message = forms.CharField(widget=forms.Textarea,label='信息')#指定form中组件的类型#自定义校验规则,该方法在校验时被系统自动调用,次序在“字段约束”之后defclean_message(self):

message= self.cleaned_data['message']#能到此处说明数据符合“字段约束”要求num_Words =len(message.split())ifnum_words < 4:raiseforms.ValidationError("单词个数低于4个!")returnmessage

5、thanks.html

<!DOCTYPE html><html><head><title></title></head><body><h2>Thanks for contact!!</h2></body></html>

三、两种不同的页面显示

1、forms.py中默认的方式(简单测试)

1)contact_author.html:

<html>

<style type="text/css">{#<ul class="errorlist">。。。</ul> #}{#ul标签下的class="errorlist"的属性进行渲染 #}{# 标签下的属性 #}ul.errorlist {

margin: 0;

padding: 0;

}

{#<ul class="errorlist"><li>单词个数低于4个!</li></ul> #}{#errorlist class下的 li标签内的元素进行渲染 #}{# 属性下一级的标签 #}.errorlist li {

background-color: red;

color: white;

display: block;

font-size: 10px;

margin: 0 0 3px;

padding: 4px 5px;

}

.field{

background-color: gray;

}</style>

<head>

<title>Contact us</title>

</head>

<body>{%ifform.errors %}<p style="color: red;">Please correct the error{{ form.errors|pluralize }} below.</p>{% endif %}<form action=""method="post">

<table>{{ form.as_table }}</table>

<input type="submit"value="提交">

</form>

</body>

</html>

2)测试

初次访问:

打印结果:

<tr><th><labelfor="id_subject">主题:</label></th><td><inputid="id_subject"maxlength="10"name="subject"type="text"/></td></tr><tr><th><labelfor="id_email">Email:</label></th><td><inputid="id_email"name="email"type="email"/></td></tr><tr><th><labelfor="id_message">信息:</label></th><td><textareacols="40"id="id_message"name="message"rows="10"></textarea></td></tr>False

2、页面中自定义显示方式(详细测试)

1)contact_author.html

<html>

<style type="text/css">{#<ul class="errorlist">。。。</ul> #}{#ul标签下的class="errorlist"的属性进行渲染 #}{# 标签下的属性 #}ul.errorlist {

margin: 0;

padding: 0;

}

{#<ul class="errorlist"><li>单词个数低于4个!</li></ul> #}{#errorlist class下的 li标签内的元素进行渲染 #}{# 属性下一级的标签 #}.errorlist li {

background-color: red;

color: white;

display: block;

font-size: 10px;

margin: 0 0 3px;

padding: 4px 5px;

}

.field{

background-color: gray;

}</style>

<head>

<title>Contact us</title>

</head>

<body>{%ifform.errors %}<p style="color: red;">Please correct the error{{ form.errors|pluralize }} below.</p>{% endif %}<form action=""method="post">

<divclass="field">{#自动生成的默认错误信息显示 #}{#会被翻译成:<ul class="errorlist"><li>这个字段是必填项。</li></ul> #}{{ form.subject.errors }}<labelfor="id_subject">页面自定义的主题:</label>{{ form.subject }}

{#自定义的错误信息显示 #}{%ifform.subject.errors%}<labelfor="id_self_def_error_info"style="color: red;">

*自定义错误信息:主题不能为空</label>{% endif %}</div>

<divclass="field">{{ form.email.errors }}<labelfor="id_email">页面中自定义的email:</label>{{ form.email }}</div>

<divclass="field">{{ form.message.errors }}<labelfor="id_message">页面中自定义的信息:</label>{{ form.message }}</div>

<input type="submit"value="提交">

</form>

</body>

</html>

2)测试

a)首次访问

打印结果:

<tr><th><labelfor="id_subject">主题:</label></th><td><inputid="id_subject"maxlength="10"name="subject"type="text"/></td></tr><tr><th><labelfor="id_email">Email:</label></th><td><inputid="id_email"name="email"type="email"/></td></tr><tr><th><labelfor="id_message">信息:</label></th><td><textareacols="40"id="id_message"name="message"rows="10"></textarea></td></tr>False

b)输入正确格式并提交

打印结果:

c)输入错误格式并提交

打印结果:最终页面显示时,form类中定义的label文字,被自定义的内容替换

<tr><th><labelfor="id_subject">主题:</label></th><td><ulclass="errorlist"><li>这个字段是必填项。</li></ul><inputid="id_subject"maxlength="10"name="subject"type="text"/></td></tr><tr><th><labelfor="id_email">Email:</label></th><td><inputid="id_email"name="email"type="email"value="aaa@sina.com"/></td></tr><tr><th><labelfor="id_message">信息:</label></th><td><ulclass="errorlist"><li>单词个数低于4个!</li></ul><textareacols="40"id="id_message"name="message"rows="10">s</textarea></td></tr>数据不符合要求<ulclass="errorlist"><li>这个字段是必填项。</li></ul><ulclass="errorlist"><li>单词个数低于4个!</li></ul>

ps: 如果email格式不正确,页面会直接弹出提示,而不会提交到后台

参考:http://djangobook.py3k.cn/2.0/chapter07/

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航