`
剑事
  • 浏览: 62968 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Django 1.0 中文文档-----指导 第三部分 发布视图

阅读更多

 编写你的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:

     

    1. from django.conf.urls.defaults import *
    2. urlpatterns = patterns('',
    3.     (r'^polls/$''mysite.polls.views.index'),
    4.     (r'^polls/(?P<poll_id>\d+)/$''mysite.polls.views.detail'),
    5.     (r'^polls/(?P<poll_id>\d+)/results/$''mysite.polls.views.results'),
    6.     (r'^polls/(?P<poll_id>\d+)/vote/$''mysite.polls.views.vote'),
    7. )

     

    当有"/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文件加入下面的代码:

    1. from django.http import HttpResponse
    2. def index(request):
    3.     return HttpResponse("Hello, world. You're at the poll index.")

     

    这是个简单的视图,访问"/polls/" 你会看到相应的内容输出。

    我们继续创建接下来的视图,这个有一点不通,多了一个参数

     

     

     

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

     

    访问"/polls/34/". 你会看到URL传入的ID

     

    写一个有实际功能的视图

     

    每个视图都会负责做些事情,返回一个HttpResponse 对象,包含请求页面的内容,或抛出HTTP 404 异常。

    视图可以读取数据库数据,可以使用Django带的模板,也可以使用第三方模板,还可以输出PDF,XML,ZIP等。

    为了方便,我们用DJANGO自己的数据库API根据发布时间显示5挑问卷,用逗号分开

     

    1. from mysite.polls.models import Poll
    2. from django.http import HttpResponse
    3. def index(request):
    4.     latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    5.     output = ', '.join([p.question for p in latest_poll_list])
    6.     return HttpResponse(output)

    有个问题,如果页面比较复杂,这里用python编写html会很麻烦,那么我们可以使用django的模板来解决。

     

    1. from django.template import Context, loader
    2. from mysite.polls.models import Poll
    3. from django.http import HttpResponse
    4. def index(request):
    5.     latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    6.     t = loader.get_template('polls/index.html')
    7.     c = Context({
    8.         'latest_poll_list': latest_poll_list,
    9.     })
    10.     return HttpResponse(t.render(c))

    程序会调用"polls/index.html"模板,同时会传入一个字典到给模板,刷新页面你会看到下面输出

     

    TemplateDoesNotExist at /polls/
    polls/index.html

     

    提示没有这个模板文件,我们编辑 TEMPLATE_DIRS 在 settings.py 文件中,设置模板目录,在"[template_directory]/polls/index.html" 位置添加模板文件,代码入校

     

    1. {% if latest_poll_list %}
    2.     <ul>
    3.     {% for poll in latest_poll_list %}
    4.         <li>{{ poll.question }}</li>
    5.     {% endfor %}
    6.     </ul>
    7. {% else %}
    8.     <p>No polls are available.</p>
    9. {% endif %}

     

    一个快捷方法: render_to_response()

     

    1. from django.shortcuts import render_to_response
    2. from mysite.polls.models import Poll
    3. def index(request):
    4.     latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    5.     return render_to_response('polls/index.html''latest_poll_list': latest_poll_list})

     

    抛出404

     

    投票详细内容视图

     

    1. from django.http import Http404
    2. # ...
    3. def detail(request, poll_id):
    4.     try:
    5.         p = Poll.objects.get(pk=poll_id)
    6.     except Poll.DoesNotExist:
    7.         raise Http404
    8.     return render_to_response('polls/detail.html', {'poll': p})

     

    如果请求的投票ID 不存在,就会升级404 异常

     

    快捷函数 get_object_or_404()

     

    1. from django.shortcuts import render_to_response, get_object_or_404
    2. # ...
    3. def detail(request, poll_id):
    4.     p = get_object_or_404(Poll, pk=poll_id)
    5.     return render_to_response('polls/detail.html', {'poll': p})

     

    同样还有一个 get_list_or_404() 函数

     

    使用模板系统

     

    回到投票detail()视图,在模板路径建立"polls/detail.html" 文件

     

    1. <h1>{{ poll.question }}</h1>
    2. <ul>
    3. {% for choice in poll.choice_set.all %}
    4.     <li>{{ choice.choice }}</li>
    5. {% endfor %}
    6. </ul>

     

     

    {{ poll.question }}是用点语法访问变量的属性或者字典的KEY,{% for %}是模板脚本的循环,poll.choice_set.all 投票选项的所有记录。

     

    简化URLconfs

     

    1. urlpatterns = patterns('',
    2.     (r'^polls/$''mysite.polls.views.index'),
    3.     (r'^polls/(?P<poll_id>\d+)/$''mysite.polls.views.detail'),
    4.     (r'^polls/(?P<poll_id>\d+)/results/$''mysite.polls.views.results'),
    5.     (r'^polls/(?P<poll_id>\d+)/vote/$''mysite.polls.views.vote'),
    6. )

    视图函数部分都是完整的名称,我们可以简化下配置:

     

    1. urlpatterns = patterns('mysite.polls.views',
    2.     (r'^polls/$''index'),
    3.     (r'^polls/(?P<poll_id>\d+)/$''detail'),
    4.     (r'^polls/(?P<poll_id>\d+)/results/$''results'),
    5.     (r'^polls/(?P<poll_id>\d+)/vote/$''vote'),
    6. )

    mysite.polls.views 提取出来,这样URL配置更简化了些。

     

    解耦URLconfs

     

    URLs 可以分多个文件模块配置,通过include包含进来。

    (r'^polls/', include('mysite.polls.urls')),
    polls/相关的请求就会到mysite/polls/urls.py查找匹配

     

    mysite/polls/urls.py如下:

     

     

     

    1. urlpatterns = patterns('mysite.polls.views',
    2.     (r'^$''index'),
    3.     (r'^(?P<poll_id>\d+)/$''detail'),
    4.     (r'^(?P<poll_id>\d+)/results/$''results'),
    5.     (r'^(?P<poll_id>\d+)/vote/$''vote'),
    6. )

    去掉了polls/部分

    5
    0
    分享到:
    评论

    相关推荐

      django1.0文档

      这个“django1.0文档”是官方提供的详尽指南,包含了关于 Django 1.0 的所有核心概念、功能和最佳实践,对于开发者来说是一份非常宝贵的资源。 **Django 框架基础** 1. **模型(Models)**: Django 的核心之一是它...

      Django 1.0 中文文档.doc

      《Django 1.0 中文文档》是一个详尽的指南,主要针对初学者,旨在帮助读者快速掌握Django框架的基础知识。在这个文档中,首先介绍了如何编写你的第一个Django程序,通过创建一个简单的投票应用来引导学习者逐步了解...

      Django 1.0 Cheat Sheet

      ### Django 1.0 Cheat Sheet 知识点详解 #### 概述 "Django 1.0 Cheat Sheet" 是一份非常实用的参考资料,为开发者提供了关于 Django 1.0 版本中的各种模板标签和过滤器的快速查阅指南。这份文档涵盖了从基本的文本...

      PyPI 官网下载 | django-oauth-plus-2.2.8.tar.gz

      描述进一步确认了该资源是从PyPI官方获取的,全称为`django-oauth-plus-2.2.8.tar.gz`,这是一个常见的开源软件发布格式,通常包含源代码、文档和其他相关文件。 **django-oauth-plus简介** `django-oauth-plus`是...

      PyPI 官网下载 | django-stories-1.0.tar.gz

      在Python的世界里,PyPI(Python Package Index)是官方的第三方Python软件包仓库,开发者可以在这里发布自己的Python库,供全球用户下载和使用。`django-stories-1.0.tar.gz`是一个在PyPI上发布的压缩包,它包含了`...

      PyPI 官网下载 | django-editorjs-1.0a1.tar.gz

      Python以其易读性、强大的标准库和丰富的第三方库而闻名,使得它成为开发各种软件的理想选择。 3. **后端**:标签“后端”意味着django-editorjs主要关注服务器端的开发,可能涉及数据库操作、业务逻辑处理和接口...

      PyPI 官网下载 | django_cape-1.0.tar.gz

      10. **开发实践**:在实际开发中,开发者可能会利用`django_cape`来扩展Django的功能,比如增加新的管理界面、数据处理逻辑或集成第三方服务。 通过上述内容,我们可以看出`django_cape-1.0.tar.gz`是一个基于...

      Django book pdf 完整版

      本书由Adrian Holovaty和Jacob Kaplan-Moss共同创作,于2006年首次发布,版本号v1.0,遵循GNU自由文档许可协议。 ### 关键知识点: #### Django框架介绍 Django框架以其“不要重复自己”(DRY)的原则著称,这意在...

      Django_mock系统登录页面所用的css

      在Django项目中,我们需要在视图(views.py)中处理登录逻辑,并在模板(templates)中引用CSS文件。在模板文件(例如`login.html`)的`&lt;head&gt;`部分,使用`&lt;link&gt;`标签链接到`login.css`: ```html &lt;!DOCTYPE html&gt;...

      [博客空间]Nbs博客系统 v1.0 beta 无限级分类版_nbs1.0beta.zip

      3. **用户界面与交互设计**:作为一个面向用户的平台,Nbs博客系统v1.0 beta应注重用户界面的友好性和易用性。它可能包含了清晰的导航菜单、美观的主题、易于操作的文章编辑器,以及响应式设计,确保在不同设备上都...

      [博客空间]Nbs博客系统 v1.0_nbs.zip

      9. **统计分析**:集成Google Analytics或其他第三方统计工具,帮助用户了解博客的访问量、热门文章、用户来源等数据,以便优化内容策略。 10. **安全性**:Nbs博客系统应考虑安全措施,如使用HTTPS加密传输、防止...

      django框架基于模板 生成 excel(xls) 文件操作示例

      传统的做法可能会使用Python的一些第三方库如`xlwt`或`openpyxl`来创建Excel文件,这些库虽然功能强大,但在某些场景下可能过于复杂且不易维护。因此,利用Django框架内置的模板引擎来生成Excel文件成为了一个值得...

    Global site tag (gtag.js) - Google Analytics