惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Engineering at Meta
Engineering at Meta
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
博客园_首页
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
博客园 - Franky
Cyberwarzone
Cyberwarzone
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
T
Tailwind CSS Blog
Project Zero
Project Zero
博客园 - 叶小钗
S
SegmentFault 最新的问题
K
Kaspersky official blog
B
Blog
T
The Exploit Database - CXSecurity.com
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
G
Google Developers Blog
Security Latest
Security Latest
T
Tenable Blog
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Help Net Security
T
Threat Research - Cisco Blogs
美团技术团队
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
F
Fortinet All Blogs
NISL@THU
NISL@THU
大猫的无限游戏
大猫的无限游戏
The Last Watchdog
The Last Watchdog
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
D
DataBreaches.Net

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
django笔记之Generic views
2014-03-11 · via 夜行人

为何要使用通用视图呢,一步步地定义url,写函数取数据,渲染模板不也能完成任务么?仅仅因为这些函数比较高级,我们就得学,为了证明自己django用的熟练?当然不是啦,djangobook中有一段话很好地回答了why的问题:

  • 在最坏的情况下, Web开发是一项无聊而且单调的工作(大多情况还是很有趣的啦~)。在视图的层面上,也经历着这种令人厌倦的事情。Django的通用视图可以减少这些痛苦。 它抽象出一些在视图开发中常用的代码和模式,这样就可以在无需编写大量代码的情况下,快速编写出常用的数据视图。 事实上,前面章节中的几乎所有视图的示例都可以在通用视图的帮助下重写。

‘技术让生活更美好’,我们只是想拥有更多的时间陪喜欢的人,做喜欢的事,更多的时间出游,看书,睡懒觉。所以我们需要更高级的工具来节省时间,提高效率。那么我们还有什么理由不好好学习高级工具呢。
好的既然值得学习,我们趁热打铁进入内容部分吧。

Djangobook第11章中说内建通用视图可以实现如下功能:

  • 完成常用的简单任务: 重定向到另一个页面以及渲染一个指定的模板。
  • 显示列表和某个特定对象的详细内容页面。
  • 呈现基于日期的数据的年/月/日归档页面,关联的详情页面,最新页面。像是典型的新闻报纸归档。

这些都是极其常见的需求,尤其是在一个新闻发布系统中,而大多企业建站需要的仅仅是个新闻发布系统而已。

###使用举例:

####direct_to_template

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#url.py
#coding=utf-8
#呈现静态“关于”页面

from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    (r'^about/$', direct_to_template, {
        'template': 'about.html'
    })
)

direct_to_template视图仅仅是直接从传递过来的额外参数获取信息并用于渲染视图。
这样就不用为了呈现一个静态页,mvc都得走一遍。
direct_to_template 。 因为它返回一个HttpResponse对象,我们只需要简单的返回它就好了。例如可以这样:

1
2
3
4
5
def about_pages(request, page):
    try:
        return direct_to_template(request, template="about/%s.html" % page)
    except TemplateDoesNotExist:
        raise Http404()

其他通用视图也是同理。

####对象的通用视图list_detail(使用djangobook中的例子)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#models.py
class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['name']

#urls.py
from django.conf.urls.defaults import *
from django.views.generic import list_detail
from mysite.books.models import Publisher

publisher_info = {
    'queryset': Publisher.objects.all(),
    'template_name': 'publisher_list_page.html',#
}

urlpatterns = patterns('',
    (r'^publishers/$', list_detail.object_list, publisher_info)
)

)

那么通用视图究竟有哪些可选的参数呢,可以参考这里Appendix C: Generic View Reference

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

特别说明下context字典项会被模板使用。如果不指定模板,该函数将使用[app_name]/[model_name]_list.html作为模板,这很有些约定优于配置味道。

object_list函数创建的context中会包含许多字典项: 深入Django(1): 通用视图 (generic views)这篇博客给出了详细的中文注释:

  • 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字典中。我们接下去说如何扩展通用视图,go on ~

####扩展通用视图

在我们最开始举的publisher例子中(来自djanobook),可以这样扩展context字典

1
2
3
4
5
6
publisher_info = {
    'queryset': Publisher.objects.all(),
    'template_object_name': 'publisher',
    'extra_context': {'book_list': Book.objects.all()}#这是错的!!使用下面一个
    'extra_context': **{'book_list': Book.objects.all}
}

这样就把一个 {{ book_list }} 变量放到模板的context中。 这个方法可以用来传递任意数据 到通用视图模板中去,这是非常方便的.
需要注意的是all()不可立刻触发,应当由请求事件来触发,因此作为函数传递,不写().这是一个函数的引用,并没有真正调用它(通用视图将会在渲染时调用它)。
还有就是选项’queryset’仅仅是普通的queryset,你可以用对象的子集,比如'queryset':Publisher.objects.filter(name='Harry')

###当数据过滤比较复杂时

这是我们可以把通用视图写到函数里,前头说过通用视图返回一个HttpResponse对象,我们提供参数返回它就好,故而用在views中是没问题的,像酱紫:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#urls.py
urlpatterns = patterns('',
    (r'^publishers/$', list_detail.object_list, publisher_info),
    **(r'^books/(\w+)/$', books_by_publisher),**
)

#views.py
from django.shortcuts import get_object_or_404
from django.views.generic import list_detail
from mysite.books.models import Book, Publisher

def books_by_publisher(request, name):

    # Look up the publisher (and raise a 404 if it can't be found).
    publisher = get_object_or_404(Publisher, name__iexact=name)

    # Use the object_list view for the heavy lifting.
    return list_detail.object_list(
        request,
        queryset = Book.objects.filter(publisher=publisher),
        template_name = 'books/books_by_publisher.html',
        template_object_name = 'book',
        extra_context = {'publisher': publisher}
    )

我的个人习惯是直接查阅源码来得快些。推荐使用github的库内搜索功能,比如我们搜索django,之后在django项目中搜索object_list,这样每回遇到新的库,不一定非要下载到本地看代码样随时随地想起来都可以查阅,甚至火车晚点时,可以用手机看看源码。读源码也挺有意思的。许多大项目,源码都写得十分漂亮。

好了,你现在有了更高效的工具了,因此节约出来的时间可以陪小伙伴去玩耍啦

###Django提供的其他通用视图

我们用深入Django(1): 通用视图 (generic views)中归纳的:

分布在几个模块中:

  • 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 显示按照年/月/日/序号找到的对象

剩下的就是查阅文档,了解参数了。

我的个人习惯是直接查阅源码来得快些。推荐使用github的库内搜索功能,比如我们搜索django,之后在django项目中搜索object_list,这样每回遇到新的库,不一定非要下载到本地看代码样随时随地想起来都可以查阅,甚至火车晚点时,可以用手机看看源码。读源码也挺有意思的。许多大项目,源码都写得十分漂亮。

###参考资料: