zoukankan      html  css  js  c++  java
  • 深入Django(1): 通用视图 (generic views) [转]

    本文转自:http://blog.csdn.net/thinkinside/article/details/7251130,

    作者ThinkInside的博文中有一个Django项目的从需求到设计到实现的整个系列文章,打算系统学习下。

    Django官方文档:https://docs.djangoproject.com

    如果对Django的基础部分尚不熟悉,请参考《Django实战》系列

    欢迎访问Django专栏:http://blog.csdn.net/column/details/django.html


    内容提要
    1. 回顾Django的视图函数(view function)
    2. 在视图函数中使用模板
    3. 简化视图函数的两个工具
    4. 使用通用视图函数
    5. Django提供的通用视图

    1. 回顾Django的视图函数(view function)

    Django中将视图定义为一种函数,我们称其为视图函数(view function)。当Django框架接收到http请求的时候,从定义的urlpatterns中寻找url表达式进行匹配,一旦找到匹配的项,就将 HTTPRequest以及匹配到的其他字符串作为参数,调用找到的视图函数,然后根据视图函数返回的HTTPResponse对象进行响应。所以视图函 数应该至少接收一个django.http.HTTPRequest对象作为参数,并返回django.http.HTTPResponse对象,如下:

    1. def my_view(request, *args, **kwargs):   
    2.      response = HTTPResponse()  
    3.      … ...  
    4.      return response  

    2. 在视图函数中使用模板

    视图函数返回的response对象中包含一些头(Header)信息和内容(Content),而我们通常通过模板来生成内容,所以我们经常用到的视图函数应该是这样:

    1. def my_view_with_template(request, *args, **kwargs):  
    2.      var1 = foo  
    3.      var2 = bar  
    4.      t = get_template('path_name_of_template_file')  
    5.      c = Context({'key1':var1,'key2':var2})  
    6.      content = t.render( c)  
    7.      return HTTPResponse(content)  

    3. 简化视图函数的两个工具

    总是写这样的代码实在是让人厌倦,所以Django为我们提供了两个有用的工具:
    一个是django.shortcuts.render_to_response函数,接收一系列的参数,包括模板路径、context使用的字典、原始的context实例以及要设定的mimetype等:
         render_to_response(template_path_name, dictionary=None, context_instance=None, mimetype=None)
    另一个是locals()函数,将所有的局部变量组装成一个字典。
    有了这两个工具,视图函数就可以这样写:

    1. def my_view_with_template(request, *args, **kwargs):  
    2.      var1 = foo  
    3.      var2 = bar  
    4.    return render_to_response('path_name_of_template_file', locals())  

    4. 使用通用视图函数

    有了这两个工具,编写视图函数确实可以简化很多。但是这样你就满意了吗?Django并没有就此止步,更进一步注意到,很多视图函数其实都在做同样 的事情,比如显示一组模型对象的列表,显示模型对象的详细信息,对模型对象的增、删、改操作等。为了简化对这些情况的处理,Django定义了一系列的通 用视图(generic views),我们只需要使用这些内置的通用视图函数,而无需自己编写就可以实现相应的功能。

    使用通用视图的方法是在URLconf文件中创建参数字典,将字典作为URLconf元组的第三个成员,即可自动在调用视图函数时向其传递参数了。 比如在django.views.generic.list_detail模块中的object_list函数,用于显示模型对象的列表,可以接受 queryset参数作为模型对象的结果集。如果我们要用该视图函数显示在《Django实战》系列中的创建的第一个模型类Product的列表,可以在URLconf中这样配置:

    1. from django.conf.urls.defaults import *  
    2. from django.views.generic import list_detail  
    3. from depot.depotapp.models import Product  
    4.   
    5. product_info = {  
    6.     'queryset': Product.objects.all(),  
    7. }  
    8.   
    9. urlpatterns = patterns('',  
    10.     (r'^product/list/$', list_detail.object_list, product_info)  
    11. )  

    除了queryset外,object_list函数还可以接收许多其他的参数:

    1. object_list(request, queryset, paginate_by=None, page=None, allow_empty=True,   
    2.         template_name=None, template_loader=loader, extra_context=None,   
    3.         context_processors=None, template_object_name='object', mimetype=None  
    4. )  

    通用视图函数接收到参数后,会创建context,并渲染模板,最后返回HTTPResponse对象。object_list函数创建的context中会包含以下字典项:

      object_list             要显示的对象的list
      is_paginated         是否分页
      results_per_page 如果分页,存储每页记录数
      has_next              是否有下一页
      has_previous       是否有上一页
      page                     当前页码
      next                      下一页
      previous               上一页
      pages                   总页数
      hits                       总条目数
      last_on_page       本页最后录一条记录的序数(从1开始)
      first_on_page       本页第一条记录的序数(从1开始)
      page_range          页码范围的列表

    如果这些context字典项不能满足你的需要,还可以通过指定extra_context参数,传入一个字典,该字典中的内容会被合并到context字典中。


    context字典项会被模板使用。如果不指定模板,该函数将使用[app_name]/[model_name]_list.html作为模板,指定模板的方法也是通过参数字典,比如:

    1. product_info = {  
    2.     'queryset': Product.objects.all(),  
    3.     'template_name''depotapp/another_product_list.html'),  
    4.  }  

    这个参数字典会传入template_name参数来指定渲染的模板文件。

    5. Django提供的通用视图

    除了object_list外,Django还提供了许多通用视图函数,分布在几个模块中:

    django.views.generic.list_detail模块

    • object_list      显示模型对象列表   
    • object_detail  显示单个模型对象

    django.views.generic.create_update模块

    • create_object    创建模型对象
    • update_object   修改模型对象
    • delete_object    删除模型对象

     

    django.views.generic.simple模块

    • direct_to_template   直接使用指定的模板渲染给定的context对象
    • redirect_to   重定向到指定的url

    django.views.generic.date_based模块

    这个模块主要处理“按时间查看存档”的功能,来源于新闻出版行业。具体包括:

    • archive_index   最顶级的归档,列出所有年份及指定数量的最新对象
    • archive_year     按年归档,列出所有拥有对象的月份
    • archive_month   按月归档,列出本月的所有对象,找到拥有对象的上一个、下一个月份
    • archive_week     按周归档,列出本周的所有对象
    • archive_day     按日归档,列出当天的所有对象,找到拥有对象的上一个、下一个日期
    • archive_today     当前日期(今天)的按日归档
    • object_detail     显示按照年/月/日/序号找到的对象

    这些通用视图函数不再一一介绍,可以参考Django API文档,关注其参数,context内容和默认模板,就能基本掌握其使用。



  • 相关阅读:
    selenium3 + python
    selenium3 + python
    Linux 文件查找
    Linux 重定向与管道
    MySQL —— 基本查询方法
    Linux 用户和文件权限管理
    Linux bash介绍与使用
    Linux 文件操作
    Linux 文件系统简介
    Linux 帮助命令
  • 原文地址:https://www.cnblogs.com/xiami303/p/2506183.html
Copyright © 2011-2022 走看看