这篇教程从第二部分结束的地方开始。我们继续制作网页投票系统并且把重点投放在对外的接口上-“视图”。
概览
视图是你的Django应用的一种页面类型,通常服务于一个特定的功能并且有一个特定的模板。比如,在一个博客系统里面,你可能需要以下视图:
- 博客主页 - 显示最新的几个条目。
- 条目具体内容页 - 一个条目的永久链接页。
- 基于年份的归档页 - 显示给定年有条目的所有月份。
- 基于月份的归档页 - 显示给定月份有条目的所有天。
- 基于每天的归档页 - 显示给定一天的所有条目。
- 评论动作 - 处理给定条目的提交评论。
在我们的投票应用中,我们将有以下四种视图: - 问题索引页 - 显示最新的几个问题。
- 具体问题页 - 显示一个具体的问题,没有结果,但是有一个表单来投票。
- 问题结果页 - 显示某个特定问题的投票结果。
- 投票动作 - 处理对于某个特定问题对一个特定选项的投票。
在Django里面,网页和其他的内容用视图来传递。每个视图被用一个简单的Python函数来表示(或者方法,如果是基于类的视图)。Django会根据提交的URL链接来选择一个视图(更精确的说是域名之后的那部分URL)。
现在你在网上可能会看到像”ME2/Sites/dirmod.asp?sid=&type=gen&mod-Core+Pages&gid=A6CD4967199A42D9B65B1B”这样的链接。你很快就会知道Django给我们比这个远远优雅的URL模式。
URL模式就是URL的一种形式 - 比如:/newsarchive/<year>/<month>/
。
为了从一个URL来获得一个视图,Django会使用URLconfs
对象。一个URLconf
将URL模式(用正则表示式表示)映射到一个视图。
这个教程介绍了基本的使用URLconfs
的方法,更具体的信息你可以参照django.urls
对应的文档。
# 写更多的视图
现在让我们在polls/views.py
里面增加更多的视图。这些视图有着微小的差别,由于他们带有一个参数:
polls/views.py
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
将这些视图和polls.urls
模块通过调用url()
绑定起来:
polls/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# ex: /polls/
url(r'^$', views.index, name='index'),
# ex: /polls/5/
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
# ex: /polls/5/results/
url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
# ex: /polls/5/vote/
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]