2014年3月25日星期二

Django:View, UrlMappping,Template

Reference: https://docs.djangoproject.com/en/1.6/intro/tutorial03/ 
【笔记性质,做好的材料还是原文!】

Web page在Django来自于view。view可由Python的函数表示(定义),view也可由方法表示。如果view是由方法而非函数定义,则说这个view是基于类的。Django通过检查URL知道对应的view。URL到view的映射,在Django里被称作URLconfs。URLconf把URL patterns映射到views。URLconf就是对应module目录下的文件urls.py

1) 定义View
官方例子,view的定义如下(views.py):
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the poll index.")

def detail(request, poll_id):
    return HttpResponse("You're looking at poll %s." % poll_id)

上面的两个函数idnex和detail分别定义(或者说指向了)了两个view。

2) 定义URLconf
作为URLconf的文件urls.py的内容如下,
from django.conf.urls import patterns, url
from polls import views

urlpatterns = patterns('',
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P\d+)/$', views.detail, name='detail'),
)

urls.py中的url方法的第二参数就是函数名。
如,views.index,就是views.py中的函数index;  urls.py中的views.detail,就是views.py中的函数detail。
在urls.py中的url方法的第三参数就是视图名称。name='index' name='detail',就是分别定义了view的名字。
url的第一参数定义了reuqest's url到view的匹配规则。

**熟悉例子的时候,因为copy/past而没有修改对应的package名,结果导致在自己的application中,一直在调用无关应用polls的views.index方法。所以,最好不用用views这样的泛泛的名字做文件名,使用YourFeatuherViews这样具体的名称做文件名更好。

3) 把应用的url路由加入到project的路由定义中
最后,在project目录下的urls.py中,加入你创建的application的URLconf:
url(r'^autoInstaller/', include('autoInstaller.urls')),
url(r'^polls/', include('polls.urls')),

4)url到view的映射过程
当请求被Django server接收到,首先有项目的URLconf进行处理,如果找到了与某个应用application对应的url,则按照url()里的定义截取掉匹配的部分,然后继续转给这个应用的URLconf,这个应用再进行匹配处理,比如根据应用的URLconfg来截取、分割url。最后转给与之匹配的view method。 这种处理方式带来一个好处——方便应用的共享、分发。加入你的应用到新的project中时,只需要修改project的URLconfig与你的应用的对应url匹配规则就好了。

5)Template
view 要么返回一个HttpResponse要么抛出Exception

在view里,实际上你可以做很多事情,读数据库记录、生成PDF...但最后总期望的总是HttpResonse、或是Exception。页面显示方面的代码可以直接在view方法里写,当然最好是写到template里。Django的模板loader可以找到你应用下的template目录作为源导入其中的模板。在你应用的目录下建立目录tempaltes,在templates目录下再建立以app名为名字的目录。在这个目录下面保存这个app需要的模板。
下面这个段是模板代码:
{% if latest_poll_list %}
    {% for poll in latest_poll_list %}
           href="/polls/{{ poll.id }}/">{{ poll.question }}
    {% endfor %}
{% else %}      No polls are available. {% endif %}
    
下面这个段是导入模板、渲染模板的代码:
from django.http import HttpResponse
from django.template import RequestContext, loader

from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = RequestContext(request, {
        'latest_poll_list': latest_poll_list,
    })
    return HttpResponse(template.render(context))
context就是把模板变量映射到python对象的字典。在模板里通过{%  %}把python代码扩起来。

可以把上面那段代码通过from django.shortcuts import render 简化成一行: return render(request, 'polls/index.html', context)

|