Request对象
每个view函数的第一个参数是一个HttpRequest对象,就像下面这个hello()函数:
from django.http import HttpResponse
def hello(request):
returnHttpResponse("Hello world")
HttpRequest对象,比如上面代码里的request变量,有众多的属性与方法:
例:
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; fr‐FR;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.GET和request.POST。二者都是类字典对象,你可以通过它们来访问GET和POST数据。
两者区别:
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(
cd[‘subject‘],
cd[‘message‘],
cd.get(‘email‘,‘dx@example.com‘),
[‘site@example.com‘],)
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>
2、form类中一些常用方法和属性
A. is_valid()
调用任何绑定form的is_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属性。相当于转换成字典了。 Django的form框架不但校验数据,它还会把它们转换成相应的Python类型数据,这叫做清理数
据。
例:
>>> f = ContactForm({subject‘: Hello, email:adrian@example.com, message: Nice site!})
>>> f.is_valid()
True
>>> f.cleaned_data
{message‘: uNice site!, email: uadrian@example.com,subject: uHello}
>>>cd = f.cleaned_data
>>>print cd
{message‘: uNice site!, email: uadrian@example.com,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‘, `‘noreply@example.com`_‘),
[`‘siteowner@example.com`_‘],
)
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
Django的form系统自动寻找匹配的函数方法,该方法名称以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())
a1、b1、values都传递到showrequest.html去了
B. 模板文件中可以直接输出request.META相关的值
例:
showrequest.html文件的内容
<html>
<body>
<table>
{{request.path}}
</table>
</body>
</html>
原文地址:http://dengxi.blog.51cto.com/4804263/1792640