`

Django新手指南(6)

阅读更多

编写你的第一个Django程序,第三部分(下)

抛出404异常

 

现在来看看这个视图——该页面会显示指定ID对应投票的问题。下面是全部代码:

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找不到对应的数据,视图函数就会抛出一个Http404异常。

 

快捷方法:get_object_or_404()

 

使用get()函数并判断是否抛出Http404错误是一套连贯的操作,因此Django提供了快捷方法。下面是重写过的detail()函数。

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_object_or_404()函数接收一个Django模型作为第一参数,其他的关键字参数将传入到模型对象的get()方法中。如果查询不到任何结果时,将抛出http404异常。

 

哲学

为什么要用get_object_or_404()而不在更高级别上自动捕获ObjectDoesNotExist异常呢?为什么使用模型API来抛出http404异常而不是抛出ObjectDoesNotExist异常?

 

还有一个与get_object_or_404()方法一样的get_list_or_404()方法——只是对应的模型对象调用的是filter()不是get()方法。如果返回列表为空的话就会抛出Http404异常。

 

编写404(找不到页面)视图

 

当视图里抛出一个Http404异常时,Django会加载一个专门用来处理这个异常的视图函数。

Django会根据变量handler404来查找这个视图,这个变量也是个Python包格式的字符串——和URLconf里面的回调函数的格式是一样的。404视图没有任何特别之处,它就只是个普通的视图而已。

 

你不用太关注于怎样编写404视图。一般,URLconf设置里有下面的机制:

from django.conf.urls.defaults import *

 

这会将handler404导入到当前模块中。你可以在django/conf/urls/defaults.py中看到,handler404默认设置成了django.views.defaults.page_not_found()这个方法。

 

关于404视图还有三点要注意:

l         Django没有在URLconf设置中找到能够匹配当前URL的正则式时,也会调用404视图函数。

l         如果你没有自定义404视图——一般情况下会使用默认的——你还是要在模板目录下创建一个404.html文件。默认的404视图会为所有的404异常使用这个模板。

l         如果DEBUG设置为True(在settings模块里),404视图是永远都不会启用的,取而代之的是显示出追踪错误信息。

 

编写500视图(服务器错误)

 

类似于404错误,URLconf也可以定义一个handler500方法,在发生服务器错误时,这个方法会调用一个指定的视图。服务器错误是指在视图代码中产生的运行时错误。

 

使用模板

 

回来看看detail()视图函数。在给定了context变量——poll之后,现在的模板polls/detail.html看起来应该是这个样子:

<h1>{{ poll.question }}</h1>

<ul>

{% for choice in poll.choice_set.all %}

    <li>{{ choice.choice }}</li>

{% endfor %}

</ul>

 

模板系统使用“变量.属性”的方法来访问变量的属性值。在{{ poll.question }}这个例子中,Django先对poll做字典查询,不成功的话,就对进行属性查询——在这个例子属性查询成功了。如果属性查询也失败的话,会尝试调用poll对象的question()方法。

 

{% for %}循环中有方法调用:poll.choice_set.all会解释为Python方法poll.choice_set.all(),该方法会返回一组可迭代的Choice对象,可以用于{% for %}标签中。

 

请参考template_guide来了解模板的更多内容。

 

简化URLconf

 

花点时间再复习复习视图和模板吧。刚才你看过URLconf设置了,也许下面的代码看上去有点冗余:

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'),

)

 

mysite.polls.views在这里重复出现了。

 

这是个很常见的情况,URLconf中可以对相同的方法前缀提供一个快捷方法。你可以把共同的方法前缀提取出来,将它作为patterns()的第一参数传入,就像下面这样:

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'),

)

 

这跟前面格式的功能是一样的。它只是变得简洁了一些。

 

解耦URLconf

 

现在应该把投票程序的URLDjango项目配置中解耦出来了。Django程序是插件式的——这意味着只要做很小的修改,它就可以转移到另外一个Django项目中。

 

现在这个投票程序已经基本上解耦了,这是由于python manage.py startapp所创建的目录结构有这严格的规范,但是还是有一部分还是耦合在这个项目中:就是URLconf

 

我们一直都是编辑mysite/urls.py里的URL设置,但是一个Django程序的URL设计应该由程序本身来规范,而不是在Django项目中规范——所以我们会在程序目录下面进行URL设置。

 

mysite/urls.py拷贝到mysite/polls/urls.py。然后移除mysite/urls.py里和该程序有关的内容并插入一条include()函数,就像下面这样:

(r'^polls/', include('mysite.polls.urls')),

 

include()函数就仅仅是引用了另外一个URLconf设置。注意一下上面的正则表达式中并没有$符号结尾,而只有一个斜杠结尾。当Django碰到include()函数时,会将URL中匹配到部分移除,并将剩下的URL字符串传入到对应的URLconf设置中做进一步的处理。

 

现在看看匹配URL/polls/34/”的情况:

l         Django会找到匹配“^polls/”的部分。

l         然后,Django移除前面的“polls/”并将其余的部分“34/”传入到mysite.polls.urls中做进一步处理。

 

现在从每一行中移除前面的“polls/”,这样就完成了解耦:

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'),

)

 

使用include()方法和URLconf解耦的初衷是为了方面做成即插即用式的URL。现在投票程序有自己独立的URLconf设置了,可以通过“/polls/”或者“/fun_polls/”甚至“/content/polls/

来访问它,程序始终都能正常运行。

 

投票程序关注的只是相对链接,不是绝对链接。

 

熟悉了视图之后,进入第四部分来学习一下表单处理和通用视图。

 

分享到:
评论

相关推荐

    Django Web开发指南

    ### Django Web 开发指南 #### 一、简介 《Django Web 开发指南》是一本专为希望使用Python进行Web应用开发的技术人员所撰写的书籍。本书由Jeff Forcier、Paul Bissex与Wesley Chun共同编写,三位作者都是在Python...

    (简体中文) Python新手使用Django架站的16堂课

    (简体中文) Python新手使用Django架站的16堂课 Python是目前很好受欢迎的程序设计语言 本书通过对Python语言使用很多的DjangoWebFramework的介绍 让读者可以轻松制作出全功能的动态网站。 本书分4部分 以16堂课来...

    Django中文版 教程.

    标题中提到的是“Django中文版 教程...综上所述,这份教程是全面介绍Django框架的中文版教材,不仅覆盖了Django的基本概念和操作,还深入探讨了高级主题和最佳实践,适合作为Python Web开发新手的入门指南和进阶参考。

    Django+Web开发指南

    ### Django+Web开发指南 #### 一、简介与概述 《Django+Web开发指南》是一本关于Python Web框架Django的详细介绍书籍...无论你是刚接触Django的新手还是已经有一定经验的开发者,都可以从中获得有价值的信息和指导。

    django1.5 开发文档

    - **5.1 至 5.2 常见问题解答**:提供了关于 Django 使用过程中可能遇到的常见问题及解答,有助于新手快速解决问题。 通过以上概览,我们可以看出 Django 1.5 文档覆盖了从入门到进阶的所有知识点,并且提供了丰富...

    新手使用Django架站的

    **Django新手指南** Django是一个基于Python的高级Web框架,它强调了代码的简洁性和可重用性,使得开发者可以快速地构建高效、可扩展的Web应用。本指南将帮助初学者理解Django的基本概念,并逐步学习如何使用Django...

    django1.8官方文档

    - **起步指南**:这部分是新手入门必备的教程,指导用户从零开始安装和配置 Django,并通过一个简单的示例应用程序来了解 Django 的基本结构和功能。 - **模型层**:解释了如何定义数据模型以及 Django ORM(对象...

    Django Documents

    本文档为 Django 1.5.3 版本提供了详尽的指导,旨在帮助开发者从零开始构建高质量的 Web 应用程序。文档由 Django 软件基金会发布于 2013 年 9 月 14 日。 #### 二、文档结构与主要内容 ##### 1. Django 文档概述 ...

    Django1.9 官方文档

    1.9版本的Django官方文档提供了从零开始学习Django的“First steps”部分,这部分内容是为新手或者刚开始学习编程的开发者准备的,内容包括从Django的基础概览、安装到具体的教程,涵盖了请求和响应、模型和管理后台...

    django document

    这部分通常会指导新手开发者如何设置开发环境,创建项目和应用,并编写简单的视图、模板和表单。 3. 模型和数据库 这部分会介绍如何定义数据模型,以及如何与数据库交互。Django提供了对象关系映射(ORM)系统,使得...

    Django web开发指南

    **Django Web开发指南** Django,一个基于Python的开源Web框架,因其高效、安全且易于使用的特点,已经成为全球开发者构建Web应用...无论你是Python新手还是资深开发者,这份指南都能成为你探索Django世界的宝贵资源。

    Django后端新手如何初始化配置

    ### Django后端新手如何初始化配置 对于初学者来说,Django 是一个功能强大且易于上手的 Python Web 开发框架。本文将详细指导你完成 Django 项目的初始化配置,并重点介绍如何连接数据库以及如何实现基本的增删改...

    Django官方文档.pdf

    首先,文档的标题“Django官方文档”表明了这是关于Django这一Python Web框架的权威指南。Django是一个高层次的Python Web框架,它促进了快速开发,并遵循MVC(模型-视图-控制器)设计模式。 接下来,文档的描述...

    django1.11 doc html版

    **Django 1.11 文档 HTML 版** Django 1.11 是一个功能强大、高效...无论你是正在学习Django的新手,还是寻求特定问题解决方案的开发者,都能从中受益。记得时常查阅文档,它会成为你Django开发旅程中不可或缺的伙伴。

    Django2.1完整手册-英文版

    这部分内容通常会引导新手快速上手Django框架。它从Django的概览开始,提供了一个快速安装指南。接下来会手把手地指导用户编写第一个Django应用程序,通常包含多个部分(例如七个部分),帮助用户逐步构建起一个完整...

    Django框架学习指南

    ### Django框架学习指南 #### 一、概述与背景 Django 是一个高级的 Python Web 框架,它鼓励快速开发、干净且实用的设计。它遵循 MVC(模型-视图-控制器)架构模式,旨在通过减少重复代码来简化Web应用程序的开发...

    django-chinese-docs pdf

    - **新手入门**:为初次接触Django的用户提供入门指南,包括环境搭建、项目创建等基础知识。 - **从零开始**:适合完全没有经验的新手,详细介绍如何一步步构建一个Django应用。 - **概览**:对Django的整体架构进行...

    Django2.0.1官方文档

    - 新手可以通过官方文档中的“编写你的第一个Django应用”系列指南快速上手,这部分内容通常会引导初学者一步步完成从安装Django到创建、运行并测试一个基础Web应用的整个过程。 3. 模型层(The model layer) - ...

    django1.11.1

    这部分内容为新手提供了快速上手指南,包括如何安装 Django、创建项目、编写第一个应用等基础知识。 **4. 模型层 (The model layer)** 模型层是 Django 框架的核心之一,负责数据的存储和检索。这一章节详细介绍了...

    django python

    文档的"Getting started"部分将指导新手用户如何安装Django,从编写第一个Django应用,到使用Django进行Web开发的各个层面。"How to install Django"部分则着重介绍了安装过程和配置环境的步骤。"Writing your first...

Global site tag (gtag.js) - Google Analytics