翻译www.djangobook.com之第十八章:自定义Django的admin界面

[color=red][b]The Django Book:第18章 自定义Django的admin界面[/b][/color]

第6章介绍了Django的admin界面,现在是回过头来仔细看看这个的时候了
我们前面讲的几次admin是Django的"杀手级特性",并且大多数Django开发人员很快爱上了它节省时间的所有特性
这样自然而然的大部分Django开发人员开始寻找自定义或者扩展admin的方法
第6章最后几部分讲到了一些定制admin界面某一部分的简单方法,重新阅读一下那些资料是个好主意
它讲述了一些定制admin的更改列表,编辑表单以及logo等等的简单方法
第6章也讨论了何时和为什么你想使用admin界面,这些资料跳跃到了其他章节,我们这里重新介绍一下:
显然,admin对编辑数据非常有用(fancy that),如果你有一些录入数据的任务,则admin不可能被其它东西打败
我们料想大多数本书的读者都将有很多数据录入的任务
Django的admin在非技术用户需要录入数据时特别闪耀,这是这个特性的最初起源
尽管如此,我们发现除了显而易见的数据录入任务,admin也在下面一些情况下有用:
1,检查数据模型,我们定义了一个新模型后第一件事就是在admin里调用它并输入一些模拟数据,这对我们发现数据
模型的错误并有一个图形界面来显示这些错误很有帮助
2,管理必须的数据,对于chicagocrime.org来说很少有数据录入的任务,因为它的数据都来自于一个自动的数据源
尽管如此,当自动获取数据的模块出问题时,通过admin可以轻松的编辑数据,这是很有用的
Django的admin不需要或者需要很少配置就可以处理这些常见的情况,但是,处理这些常见的情况如此的好意味着
Django的admin在处理其它情形时不一定很好
我们后面将谈到Django的admin不适合做的一些事情,但是现在我们先离题来看看它的一些哲学:

[b]admin的禅宗[/b]
作为它的核心,Django的admin设计用来为如下的一个单独的活动:
受信任的用户编辑结构化的内容
是的,很简单,但是这简单的一行隐藏着很多内容,Django的admin的整个哲学都基于此
让我们深入了解这个句子的子内容:
"受信任的用户"
admin设计来被你(开发者)信任的人用,这不仅仅表示那些被授权的用户,它表示Django假设你的内容编辑者可以
被信任来做正确的事情,这意味着编辑内容没有批准的过程,如果你信任你的用户,没有人需要对编辑的批准
这也表明了权限系统不支持基于一个对象的限制访问
如果你信任某人来编辑他自己的故事,你也将信任他不会在没有权限的情况下编辑别人的故事
"编辑"
Django的admin的首要目的是让人们编辑内容,这最初看起来很显而易见,但是也存在一些细小而强大的影响
例如,尽管admin对重新视查数据很有用,但是它不是设计来干这个的,注意缺少"can view"权限(参考第12章)
Django假设如果用户被允许在admin里查看内容,他们也被允许编辑它
另外一个很值得注意的地方是admin缺少一些例如"工作流"的东西,如果一些任务需要几步来完成,admin不支持
特别的顺序来做这件事情,admin关注于编辑,而不是围绕编辑的其它活动
对于工作流的缺乏支持也起源于信任的原则,admin的哲学是,工作流属于个人问题,而不应该用代码实现
最后,注意admin缺乏统计的支持,它不支持显示总数,平均数等等
再一次说明,admin是用来编辑的,它期望你写自定义的视图来完成其它的任务
"结构化的内容"
因为Django其它部分的关系,admin希望你与结构化的数据工作,这样,admin仅仅支持编辑用Django模型存储的数据
对于其它形式的数据,你则需要自定义视图
总结
现在应该很清楚了,Django的admin不是给任何用户来做任何事情的,而是牢牢的关注一点并且把这一点做的非常好
当我们需要扩展Django的admin时,同一哲学的大部分内容存在与此(注意扩展性无处不在)
因为自定义的Django视图可以做任何事情,而且它们可以可视化的集成到admin(参看下面内容),内建的定制admin的
机会在一定程序上被设计所限制

[b]定制admin模板[/b]
我们下面将看到,你有几种工具来定制内建的admin模板,但是对于其它任务,例如需要自定义工作流或者细粒度权限
你将需要阅读本章末尾讲到的定制admin视图
现在我们来看看快速定制admin的外观和行为,第6章讲到了一些常见的任务,如更改logo样式和提供自定义admin表单
就这点来说,我们通常需要更改一个特殊项的一些模板
admin的每一个视图,如更改列表,编辑表单,删除确认页面,历史视图等都有一个分配的模板
而这个模板可以通过几种方式来覆盖
首先,你可以全局覆盖模板,admin视图使用标准模板载入机制来寻找模板,所以如果你在你的模板目录里创建模板
Django将载入并使用这些模板而不是使用Django绑定的默认admin模板
这些全局模板如下:
视图 基本模板名
更改列表 admin/change_list.html
增加/编辑表单 admin/change_form.html
删除确认 admin/delete_confirmation.html
对象历史 admin/object_history.html
尽管如此,大多数情况下你只想更改一个单独的对象或者app的模板而不是全局的模板
这样的话,每个admin视图首先寻找模型和app专有的模板,这些视图按下面的顺序寻找模板:
admin///