django学习笔记(五)

1)url配置里的urlpatterns对象是可以相加的。以此可以区分多个不同前辍。

from django.conf.urls.defaults import *

urlpatterns = patterns('myproject.blog.views',

>> url(r'^$','index'),

>> url(r'^blog/new/$','new_post'),

>> url(r'^blog/topics/(?P<topic_name>\w+)/new/$','new_post'),

)

urlpatterns += patterns('myproject.guestbook.views',

>> url(r'^guestbook/$','index'),

>> url(r'^guestbook/add/$','new_entry'),

)

2)为了更好地支持模块化,url配置可以拆分成多个文件,通过include方法聚合真来。注意每个拆分出去的url,其正则还是由^打头的,虽然它并不是真正的网站根目录,但仍然需要以^打头,而不是简单的拼接。

urlpatterns = patterns('myproject.guestbook.views',

>> url(r'^guestbook/$','index'),

>> url(r'guestbook/add/$','new_entry'),

)

效果等同于

urlpatterns = patterns('',

>> url(r'^guestbook/',include('myproject.guestbook.urls')),

)

# guestbook/urls.py

urlpatterns = patterns('myproject.guestbook.views',

>> url(r'^$','index'),

>> url(r'^add/$','new_entry'),

)

3)不同于php,用全局数组来访问GET、POST、COOKIE等数据,在django里,http请求和响应都是要经过django中间件进行处理的,序列化得很好的对象数据。在编程的时候非常方便,而经过中间件的处理,又能还原成服务器和客户端能识别的格式。

4)HttpRequest是封装后的http请求,它是作为参数的形式传递给视图函数的。它有以下常用属性和方法:

1> GET和POST,接收客户端传递过来的数据,是类似于字典类型的对象(可以当做字典用)。如果不清楚是用GET还是POST方法传过来的,还可以使用REQUEST字典(虽然并不推荐使用它)。

2> COOKIES和session。 注意session是小写的。

3> path。URL里域名后的部分。例如/blog/2007/11/04,这个通常也是URLconf要处理的字符串。

4> method。 "GET"或"POST"两者之一。

5> encoding。 标明了用来解码表单提交数据所砖雕的编码字符集的字符串。

6> user。 Django的认证用户,只有当你的站点激活Django的认证机制时才会出现。

7> FILES。 这是一个字典类对象,包含了所有通过文件输入表单字段上传的文件,其中每一个值又都是另一个字典,里面包含了文件名、内容的类型以及文件的内容。(和php关于file的二维数据异曲同工)

8> META。 这也是一个字典。它常用的键有

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

2. HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。

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

4. SERVER_NAME。

5)视图会返回一个HttpResponse对象,这个对象接受一个mimetype参数,默认情况值下为'text/html',如果想返回其它类型的对象,可以设置HttpResponse(mimetype='text/csv')、return HttpResponse(image_data, mimetype="image/png")等。

6)响应对象里的另一个功能就是设置HTTP头,这时你可以把HttpResponse当作是一个字典来用。

response = HttpResponse()

response["Content-Type"] = "text/csv"

response["Content-Length"] = 256

7)视图函数里还有一些特殊方法可以简化输出。

1> render_to_response。 简化渲染模块的过程。

2> Http404。 抛出404错误。

3> get_object_or_404和get_list_or_404。 这两个函数就是把两个步骤合二为一:获得一个对象或者列表,如果失败则抛出Http404。

###手动抛出404的方法

from django.shortcuts import render_to_response

from django.http import Http404

from myproject.myapp.models import Person

def person_detail(request,id):

>> try:

>>>> person = Person.objects.get(pk=id)

>> except Person.DoesNotExist:

>>>> raise Http404

>> return render_to_response("person/detail.html",{"person":person})

==============================================================

###利用get_object_or_404,替代前面那个:

from django.shortcuts import render_to_response, get_object_or_404

from myproject.myapp.models import Person

def person_detail(request,id):

>> person = get_object_or_404(Person,pk=id)

>> return render_to_response("person/detail.html",{"person":person})

8)过滤器不仅可以在{{}}里使用,也可以在{% %}里使用。

{% ifequal object_list|length 10 %}

9) Form类和Model类很相似,很多时候Form类和Model类是对应的,为了避免代码重复,Form类提供了一个ModelForm子类。ModelForm类和Form类有一个重要的区别,就是它们有一个sava方法。

from django import newforms as forms

from myproject.myapp.models import Person

class PersonForm(forms.ModelForm):

>> class Meta:

>>>> model = Person

===========================

from myproject.myapp.forms import PersonForm

form = PersonForm({'first':'John','middle':'Quincy','last':'Doe'})

new_person = form.save()

10) form的编辑。

# Create a form instance from POST data.
>>> f = ArticleForm(request.POST) 
# Save a new Article object from the form's data.
>>> new_article = f.save() 
# Create a form to edit an existing Article.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(instance=a)
>>> f.save() 
# Create a form to edit an existing Article, but use # POST data to populate the form.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(request.POST, instance=a)
>>> f.save()

11) form的典型调用。

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 love your site!'})
>>>>> return render_to_response('contact_form.html', {'form': form})
posted on 2010-09-18 15:49  真阿当  阅读(108)  评论(0编辑  收藏  举报