【笔记性质,做好的材料还是原文!】
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
)
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)
|