编写你的Django应用 第三部分
我们接着上篇开始,继续网页投票应用,本篇我们着重在建立发布视图。
理念
视图在Django中就是一个特定功能和特定模板的网页,例如在博客程序中你会有如下视图:
博客首页 – 显示最新记录.
进入详细内容页面 – 页面固定链接.
基于年的存档页 – 显示给定年里所有月份的进入点.
基于月的存档页 – 显示给定月里所有天的进入点. .
基于日的存档页 – 显示给定日里所有天的进入点.
评论 – 所有评论的进入链接.
在我们的投票应用程序中,我们有下面四个视图:
Poll “archive” 页 – 显示最新的投票.
Poll “detail” 页 – 显示投票页面.
Poll “results” 页 – 显示投票结果.
Vote action – 处理投票程序的页面.
在Django里,每个视图都是用一个简单的python函数描述的。
设计你的urls
编写视图第一步是设计你的URL结构,需要借助python的一个组件URLconf将python代码和URL联系起来。
当用户请求Django的页面,系统会查找ROOT_URLCONF 设置,Django加载组件并查找urlpatterns变量,一段类似如下格式的序列:
(regular expression, Python callback function [, optional dictionary])
Django会从第一个规则表达式开始,一直往下,匹配请求的URL直到匹配上,当找到匹配的时候,Django会回调函数,为第一个参数传入HttpRequest 对象,还有表达式里捕获的值。
要了解更多HttpRequest,URLconfs详情,可查看具体文档。
当我们创建工程的时候,mysite/urls.py会被自动创建。settings.py中默认配置指定位置ROOT_URLCONF = 'mysite.urls'
编辑mysite/urls.py:
- from django.conf.urls.defaults import *
- urlpatterns = patterns('',
- (r'^polls/$', 'mysite.polls.views.index'),
- (r'^polls/(?P<poll_id>\d+)/$', 'mysite.polls.views.detail'),
- (r'^polls/(?P<poll_id>\d+)/results/$', 'mysite.polls.views.results'),
- (r'^polls/(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
- )
当有"/polls/23/"这样的地址请求时,python 会匹配到 r'^polls/(?P<poll_id>\d+)/$' 这里,然后调用
mysite/polls/views.py里的detail()函数,如下:
detail(request=<HttpRequest object>, poll_id='23')
poll_id='23' 来自(?P<poll_id>\d+). 通过正则匹配捕获的值,这里也可以定义多个值来捕获。
因为URL定义没有什么扩展名定义限制你也可以像这样定义
(r'^polls/latest\.php$', 'mysite.polls.views.index'),
用php做扩展名,看起来比较幽默。不过最好还是不要定义扩展名。
注意,URL表达式是不包括GET,POST参数和域名。例如http://www.example.com/myapp/,URL配置为/myapp/。
http://www.example.com/myapp/?page=3 也同样匹配/myapp/
表达式会在django加载的时候编译。
编写你的第一个视图
好,我们还没有创建视图,只是创建了URLconf,接下来我们确认下URLconf。
启动django服务
python manage.py runserver
我们访问"http://localhost:8000/polls/",我们会看到下面的报错信息:
ViewDoesNotExist at /polls/
Tried index in module mysite.polls.views. Error was: 'module'
object has no attribute 'index'
这个信息提示我们没有在mysite/polls/views.py里创建 index() 函数
测试"/polls/23/", "/polls/23/results/" 和 "/polls/23/vote/". 都会有错误提示没有创建视图函数。
打开mysite/polls/views.py文件加入下面的代码:
- from django.http import HttpResponse
- def index(request):
- return HttpResponse("Hello, world. You're at the poll index.")
这是个简单的视图,访问"/polls/" 你会看到相应的内容输出。
我们继续创建接下来的视图,这个有一点不通,多了一个参数
- def detail(request, poll_id):
- return HttpResponse("You're looking at poll %s." % poll_id)
访问"/polls/34/". 你会看到URL传入的ID
写一个有实际功能的视图
每个视图都会负责做些事情,返回一个HttpResponse 对象,包含请求页面的内容,或抛出HTTP 404 异常。
视图可以读取数据库数据,可以使用Django带的模板,也可以使用第三方模板,还可以输出PDF,XML,ZIP等。
为了方便,我们用DJANGO自己的数据库API根据发布时间显示5挑问卷,用逗号分开
- from mysite.polls.models import Poll
- from django.http import HttpResponse
- def index(request):
- latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
- output = ', '.join([p.question for p in latest_poll_list])
- return HttpResponse(output)
有个问题,如果页面比较复杂,这里用python编写html会很麻烦,那么我们可以使用django的模板来解决。
- from django.template import Context, loader
- from mysite.polls.models import Poll
- from django.http import HttpResponse
- def index(request):
- latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
- t = loader.get_template('polls/index.html')
- c = Context({
- 'latest_poll_list': latest_poll_list,
- })
- return HttpResponse(t.render(c))
程序会调用"polls/index.html"模板,同时会传入一个字典到给模板,刷新页面你会看到下面输出
TemplateDoesNotExist at /polls/
polls/index.html
提示没有这个模板文件,我们编辑 TEMPLATE_DIRS 在 settings.py 文件中,设置模板目录,在"[template_directory]/polls/index.html" 位置添加模板文件,代码入校
- {% if latest_poll_list %}
- <ul>
- {% for poll in latest_poll_list %}
- <li>{{ poll.question }}</li>
- {% endfor %}
- </ul>
- {% else %}
- <p>No polls are available.</p>
- {% endif %}
一个快捷方法: render_to_response()
- from django.shortcuts import render_to_response
- from mysite.polls.models import Poll
- def index(request):
- latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
- return render_to_response('polls/index.html', 'latest_poll_list': latest_poll_list})
抛出404
投票详细内容视图
- from django.http import Http404
- def detail(request, poll_id):
- try:
- p = Poll.objects.get(pk=poll_id)
- except Poll.DoesNotExist:
- raise Http404
- return render_to_response('polls/detail.html', {'poll': p})
如果请求的投票ID 不存在,就会升级404 异常
快捷函数 get_object_or_404()
- from django.shortcuts import render_to_response, get_object_or_404
- def detail(request, poll_id):
- p = get_object_or_404(Poll, pk=poll_id)
- return render_to_response('polls/detail.html', {'poll': p})
同样还有一个 get_list_or_404() 函数
使用模板系统
回到投票detail()视图,在模板路径建立"polls/detail.html" 文件
- <h1>{{ poll.question }}</h1>
- <ul>
- {% for choice in poll.choice_set.all %}
- <li>{{ choice.choice }}</li>
- {% endfor %}
- </ul>
{{ poll.question }}是用点语法访问变量的属性或者字典的KEY,{% for %}是模板脚本的循环,poll.choice_set.all 投票选项的所有记录。
简化URLconfs
- urlpatterns = patterns('',
- (r'^polls/$', 'mysite.polls.views.index'),
- (r'^polls/(?P<poll_id>\d+)/$', 'mysite.polls.views.detail'),
- (r'^polls/(?P<poll_id>\d+)/results/$', 'mysite.polls.views.results'),
- (r'^polls/(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
- )
视图函数部分都是完整的名称,我们可以简化下配置:
- urlpatterns = patterns('mysite.polls.views',
- (r'^polls/$', 'index'),
- (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
- (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
- (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
- )
mysite.polls.views 提取出来,这样URL配置更简化了些。
解耦URLconfs
URLs 可以分多个文件模块配置,通过include包含进来。
(r'^polls/', include('mysite.polls.urls')),
polls/相关的请求就会到mysite/polls/urls.py查找匹配
mysite/polls/urls.py如下:
- urlpatterns = patterns('mysite.polls.views',
- (r'^$', 'index'),
- (r'^(?P<poll_id>\d+)/$', 'detail'),
- (r'^(?P<poll_id>\d+)/results/$', 'results'),
- (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
- )
去掉了polls/部分
分享到:
相关推荐
Django 1.0 中文文档.docDjango 1.0 中文文档.docDjango 1.0 中文文档.docDjango 1.0 中文文档.doc
django 1.0官方的使用文档chm打包
python库,解压后可用。 资源全名:django_admin_multilang-1.0-py3-none-any.whl
Django1.0以上版本的教材-DjangoBook2.0中文版.pdf 适用于Django1.0以上的环境
django-python3-ldap, python 3的Django LDAP用户身份验证后端 django-python3-ldapdjango-python3-ldap 为 python 2和 3提供了一个 Django LDAP用户身份验证后端。特性使用LDAP服务器验证用户身份。将LDAP用户与...
资源来自pypi官网。 资源全名:django-tables2-column-shifter-0.3.0.tar.gz
资源分类:Python库 所属语言:Python 资源全名:djangocms_algolia-1.3.1.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
为支持django3对django_cas_ng进行修改 **Features** - Support CAS version 1.0, 2.0, 3.0 - Support Single Sign Out - Configuration of services via the django Admin application - Fine control on ...
Django1.0速查手册,Django 1.0 Cheat sheet
django-admin-bootstrap-master.zip
资源来自pypi官网。 资源全名:django_pumaska-1.0rc2-py3-none-any.whl
1、基于Django+Django -Rest-Framework+Python的在线考试系统后端(源码).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目...
django-classy-tags, 基于类的Django 模板标记 django-classy-tags请参考文档/目录中的文档以获得帮助。 有关HTML呈现版本的信息,请参见这里的 。 这里项目这个项目的目标是创建一种新的编写 Django 模板标签的方法...
项目概述:django-lb-workflow 是一个基于Python的高效易用Django流程引擎源码,旨在轻松集成至现有系统。该项目主要由68个Python文件、30个HTML文件以及其他相关文件构成,共计136个文件。其中还包括了HTML模板、...
django社团管理系统-包含源码-说明文档.zip django社团管理系统-包含源码-说明文档.zip django社团管理系统-包含源码-说明文档.zip 开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 5.7(一定...
Django-2.0.4 Django-2.0.4 Django-2.0.4 Django-2.0.4 Django-2.0.4
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:django_anymail-4.1-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库。 资源全名:django-microsip-base-1.0.5.zip