Django之表单


  

Request对象

每个view函数的第一个参数是一个HttpRequest对象,就像下面这个hello()函数:

from django.http import HttpResponse

def hello(request):

returnHttpResponse("Hello world")

 

HttpRequest对象,比如上面代码里的request变量,有众多的属性与方法:

wKioL1ds82jSna99AACXjFbP8Yk782.jpg

例:

def current_url_view_good(request):

   return HttpResponse("Welcome to the page at %s" % request.path)

 

 

request.META

request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息

常见的键值有:

  • HTTP_REFERER,进站前链接网页,如果有的话。(请注意,它是REFERRER的笔误。)

  • HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。例如:

  • "Mozilla/5.0 (X11; U; Linux i686; frFR;rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .

  • REMOTE_ADDR 客户端IP,如:"12.345.67.89" (如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" )

 

注意,因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。应该用try/except 语句,或者用Python字典的 get() 方法来处理这些“可能不存在的键”:

例:

def ua_display_good1(request):

try:

   ua = request.META['HTTP_USER_AGENT']

except KeyError:

   ua = 'unknown'

   return HttpResponse("Your browser is %s" % ua)

def ua_display_good2(request):

   ua = request.META.get('HTTP_USER_AGENT','unknown')

   return HttpResponse("Your browser is %s" % ua)

 

 

提交的数据信息

除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息:request.GETrequest.POST。二者都是类字典对象,你可以通过它们来访问GETPOST数据。

 

  • 两者区别:

POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)

 

  • 表单常见的应用方法:

urls.py中设定访问路径,关联到views.py中的函数,views.py中的函数返回一个表单录入页面,该表单页面录入提交后会有一个url,urls.py中设置一个正则去匹配这个url,匹配到后又调用vews.py中设定的函数获取表单中的各个内容进行处理。

 

 

表单form

1、基本使用方法

A.       一般会建一个forms.py文件到对应应用的目录,即和views.py同一目录

forms.py内容:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField()

email = forms.EmailField(required=False)

message = forms.CharField()

 

B.       views.py中就可以调用这个类来用了

例:

from django.shortcuts import render,render_to_response

from django.http import HttpResponse

from polls.models import Question

from django.core.mail import send_mail

from django.http import HttpResponseRedirect

from django.views.decorators.csrf import csrf_exempt

frompolls.forms import ContactForm  #导入forms.py中的表单类ContactForm,用到哪个表单类就引入哪个

 

@csrf_exempt

def contact(request):

errors = []

if request.method == 'POST':

form = ContactForm(request.POST)

if form.is_valid():

cd = form.cleaned_data

send_mail(

  1. cd['subject'],

  2. cd['message'],

  3. cd.get('email','[email protected]'),

  4. ['[email protected]'],)

return HttpResponseRedirect('polls/contact/thanks/')

else:

form = ContactForm()

returnrender_to_response('polls/contact_form.html',{'form': form})

 

C.        在相应的contact_form.html上这样调用

例:

<html>

<head>

<title>Contact us</title>

</head>

<body>

<h1>Contact us</h1>

{%if form.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="Submit">

</form>

</body>

</html>

 

2form类中一些常用方法和属性

A.       is_valid()

调用任何绑定formis_valid()方法,就可以知道它的数据是否合.

例:

form.is_valid()

返回True表示没有错误,返回Flase表示某些字段有错误

 

 

B.       errors

每一个邦定Form实体都有一个errors属性,它为你提供了一个字段与错误消息相映射的字典表. 你可以逐一查看每个字段的出错消息

例:

>>> f = ContactForm({'subject': 'Hello', 'message':''})

>>> f['message'].errors

[u'This field is required.']

>>> f['subject'].errors

[]

>>> f['email'].errors

[]

 

C.        cleaned_data属性

如果一个Form实体的数据是合法的,它就会有一个可用的cleaned_data属性。相当于转换成字典了。 Djangoform框架不但校验数据,它还会把它们转换成相应的Python类型数据,这叫做清理数

据。

例:

>>> f = ContactForm({subject': Hello, email:[email protected], message: Nice site!})

>>> f.is_valid()

True

>>> f.cleaned_data

{message': uNice site!, email: [email protected],subject: uHello}

>>>cd = f.cleaned_data

>>>print cd

{message': uNice site!, email: [email protected],subject: uHello}

 

 

3、改变字段显示

当你在本地显示这个表单的时,某些字段被显示成`` input type=text`` ,例如message字段,它应该

被显示成<`` textarea`` >。我们可以通过设置 widget 来修改它:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField()

email = forms.EmailField(required=False)

message = forms.CharField(widget=forms.Textarea )

forms框架把每一个字段的显示逻辑分离到一组部件(widget)中。 每一个字段类型都拥有一个默认的部件,

我们也可以容易地替换掉默认的部件,或者提供一个自定义的部件

 

 

4、设置最大长度

一个最经常使用的校验要求是检查字段长度。例如使subject限制在100个字符以内。为此,仅需为CharField提供max_length参数,像这样:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField(max_length=100 )

email = forms.EmailField(required=False)

message = forms.CharField(widget=forms.Textarea)

选项min_length参数同样可用。

 

 

5、设置初始值

可以在创建Form实体时,使用initial参数:

def contact(request):

if request.method == 'POST':

form = ContactForm(request.POST)

if form.is_valid():

cd = form.cleaned_data

send_mail(

cd['subject'],

cd['message'],

cd.get('email', `'[email protected]`_'),

[`'[email protected]`_'],

)

return HttpResponseRedirect('/contact/thanks/')

else:

form = ContactForm(initial={'subject': 'I loveyour site!'})

return render_to_response('contact_form.html', {'form': form})

 

6、自定义校验规则

例如希望`` message`` 字段有一个额外的校验,我们增加一个`` clean_message()`` 方法到`` Form`` 类:

from django import forms

class ContactForm(forms.Form):

subject = forms.CharField(max_length=100)

email = forms.EmailField(required=False)

message = forms.CharField(widget=forms.Textarea)

def clean_message(self):

message = self.cleaned_data['message']

num_words = len(message.split())

if num_words < 4:

raise forms.ValidationError("Not enough words!")

return message

Djangoform系统自动寻找匹配的函数方法,该方法名称以clean_开头,并以字段名称结束。如果有这样的方法,它将在校验时被调用。

clean_message()方法将在指定字段的默认校验逻辑执行之后被调用。(本例中,在必填CharField这个校验逻辑之后。)因为字段数据已经被部分处理,所以它被从self.cleaned_data中提取出来

了。我们不必担心数据是否为空,因为它已经被校验过了。

我们简单地使用了len()split()的组合来计算单词的数量。如果用户输入字数不足,我们抛出一个forms.ValidationError型异常。这个异常的描述会被作为错误列表中的一项显示给用户。

在函数的末尾显式地返回字段的值非常重要。我们可以在我们自定义的校验方法中修改它的值(或者把它转换成另一种Python类型)。如果我们忘记了这一步,None值就会返回,原始的数据就丢失掉了。

 

 

7、指定标签

HTML表单中自动生成的标签默认是按照规则生成的:用空格代替下划线,首字母大写。如email的标签是"Email"。可以使用label自定义

class ContactForm(forms.Form):

subject = forms.CharField(max_length=100)

email = forms.EmailField(required=False, label='Youre-mail address' )

message = forms.CharField(widget=forms.Textarea)

 

 

技巧

 

A.       view.py中变量提交的懒人方法,使用locals()提交所有局部变量

例:

def showrequest(request):

values = request.META.items()

values.sort()

a1 = ‘hello’

b1 = ‘ni hao ‘

return render(request,'polls/showrequest.html',locals())

a1b1values都传递到showrequest.html去了

 

B.       模板文件中可以直接输出request.META相关的值

例:

showrequest.html文件的内容

<html>

<body>

<table>

`request`.`path`

</table>

</body>

</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章