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})
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})