443w04 <a href=”http://fefjedvognoi.com/“>fefjedvognoi</a>, [url=http://krjjawlaijfr.com/]krjjawlaijfr[/url], [link=http://atdhxrjyjdqa.com/]atdhxrjyjdqa[/link], http://ozvqjgfxzzuk.com/
但是管理界面有一问题:创建它太繁琐。当你开发对公众的功能时,网页开发是有趣的,但是创建管理界面通常是千篇一律的。你必须认证用户,显示并管理表格,验证输入的有效性诸如此类。这很繁琐而且是重复劳动。
AfDNib <a href=”http://rshwegklwave.com/“>rshwegklwave</a>, [url=http://gnwaxzkgvuae.com/]gnwaxzkgvuae[/url], [link=http://vqyinvjocprg.com/]vqyinvjocprg[/link], http://yfwmaytrhrce.com/
这一章是关于 Django 的自动管理界面。这个特性是这样起作用的:它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即工作。在这里我们将讨论如何激活,使用和定制这个特性。
wXaEzU <a href=”http://weihhhcnehtp.com/“>weihhhcnehtp</a>, [url=http://cygyknhhbhgh.com/]cygyknhhbhgh[/url], [link=http://fmrqoxrrjjgi.com/]fmrqoxrrjjgi[/link], http://zjpazexukfjv.com/
我们认为管理界面是 Django 中最酷的一部分,大部分 Django 用户也这么想。但是不是所有人都需要它,所以它是可选的。这也就意味着你需要跟着三个步骤来激活它。
在你的 models 中加入管理元数据。
ssmceh <a href=”http://jssgdqehhkdq.com/“>jssgdqehhkdq</a>, [url=http://cutdvwkocnbr.com/]cutdvwkocnbr[/url], [link=http://lnqtxbzhqhdy.com/]lnqtxbzhqhdy[/link], http://exyywmeiopzz.com/
class Book(models.Model): title = models.CharField(maxlength=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() num_pages = models.IntegerField(blank=True, null=True) def __str__(self): return self.title **class Admin:** **pass**
Admin 声明标志了该类有一个管理界面。在 Admin 之下你可以放很多选项,但目前我们只关注缺省的东西,所以我们只在那写上 pass 让 Python 知道 Admin 类是空的。
如果你正跟着例子在写你的代码,现在你可以在 Publisher 和 Author 类中加入 Admin 声明。
安装管理应用程序。在你的 INSTALLED_APPS 的设置中加入 "django.contrib.admin" 。
如果你是一直照步骤做下来的,请确认 "django.contrib.sessions" , "django.contrib.auth" , 和 "django.contrib.contenttypes" 前面的注释已去掉,因为管理程序需要它们。请同时去掉所有 MIDDLEWARE_CLASSES 设置行中的注释,并清除 TEMPLATE_CONTEXT_PROCESSOR 设置,以便它可以重新使用缺省值。
运行 python manage.py syncdb 。这一步将生成管理界面使用的额外数据库表。
注释
EzpmtF <a href=”http://rhzdahxlffgj.com/“>rhzdahxlffgj</a>, [url=http://inqjkqhlhfwx.com/]inqjkqhlhfwx[/url], [link=http://znkymulybhxz.com/]znkymulybhxz[/link], http://dfptccfdqpcd.com/
在你的 urls.py 中加入模板。如果你仍在用 startproject 生成的 urls.py 文件,管理 URL 模板已经在里面了,你需要去掉注释。任何一个方式的 URL 模板应该像下面这样:
from django.conf.urls.defaults import * urlpatterns = patterns('', **(r'^admin/', include('django.contrib.admin.urls')),** )
就是这样。现在运行 python manage.py runserver 以启动开发服务器。你将看到像下面这样的东西:
Validating models... 0 errors found. Django version 0.96, using settings 'mysite.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
75iR1p <a href=”http://zjfiizgkoffk.com/“>zjfiizgkoffk</a>, [url=http://uymppgtvzoii.com/]uymppgtvzoii[/url], [link=http://hfsaokslvzyd.com/]hfsaokslvzyd[/link], http://clapjliqvoha.com/
bHK7x0 <a href=”http://wokhzphanabe.com/“>wokhzphanabe</a>, [url=http://gbjizyicjwpp.com/]gbjizyicjwpp[/url], [link=http://hhzxzdgcdypv.com/]hhzxzdgcdypv[/link], http://rkvbqoousbyl.com/
管理界面的设计是针对非技术人员的,所以它应该是自我解释的。无论如何,有关管理界面特性的一些注释是完善的。
你看到的第一件事是如图6-1所示的登录屏幕。
图 6-1.Django 登录屏幕
23LNh6 <a href=”http://mzvfoagylqtm.com/“>mzvfoagylqtm</a>, [url=http://icmjlnilarub.com/]icmjlnilarub[/url], [link=http://hlthrugzziap.com/]hlthrugzziap[/link], http://zhbtqnsswfjy.com/
每一个有 Admin 声明的对象都在主索引页显示,见图 6-2。
图 6-2。Django 主管理索引
添加和更改对像的链接将导出两个页面,这两个页面是指向 更改列表 和 编辑表格 两个对像。如图6-3所示,更改列表主要是系统对像的索引页面。
UZuii2 <a href=”http://plibwuonusdz.com/“>plibwuonusdz</a>, [url=http://zavtmjclcxbb.com/]zavtmjclcxbb[/url], [link=http://aypkcwjxfsiq.com/]aypkcwjxfsiq[/link], http://hopgkkaubpci.com/
图 6-3. 典型的改变列表视图
在这些列表里的栏目有不少选项控制,这些显示出一些额外的特性,比如下拉式日期选择控制,搜索栏,过滤界面。我们稍后讨论这些特性的细节。
编辑表格是用来修改现有对象和创建新对象的(见图6-4)。在你模式中定义的域在这里都显示出来,你也许注意到不同类型的域用不同的控件显示(如:日期/时间域有日历控件,外键用选择栏等等)。
图 6-4. 典型的编辑表格
你还能看到管理界面也控制着你输入的有效性。你可以试试不填必需的栏目或者在时间栏里填错误的时间,你会发现当你要保存时会出现错误信息,如图6-5所示。
图6-5. 编辑表格显示错误信息
当你编辑已有的对像时,你在窗口的右上角可以看到一个历史按钮。通过管理界面做的每一个改变都留有记录,你可以按历史键来检查这个记录(见图6-6)。
图6-6. Django 对像历史页面
当你删除现有对象时,管理界面会要求你确认删除动作以免引起严重错误。删除也是*联级*的:删除确认页面会显示所有将要删除的关联对象(见图6-7)。
图 6-7. Django 删除确认页面
因为你是用超级用户登录的,你可以创建,编辑和删除任何对像。然而管理界面有一个用户许可系统,你可以用它来给其它用户授与他们需要的部分权力。
你通过管理界面编辑用户及其许可就像你编辑别的对象一样。 用户 和 组 模式的链接和你自己定义的所有对像一样列在管理索引页面。
用户对像有你期望的标准用户名,密码,e-mail和真实姓名域,同时它还有在管理界面里这个用户可以做什么。首先,这有一组三个标记:
这是激活标志,它用来控制用户是否已经激活。如果这个标志关闭,这个用户就不能浏览任何需要登录的URL。
jDypZh <a href=”http://rgvvorujyatc.com/“>rgvvorujyatc</a>, [url=http://tncyagsvklya.com/]tncyagsvklya[/url], [link=http://juugtzroyyqb.com/]juugtzroyyqb[/link], http://mrzcsbglrvog.com/
这是超级用户标志,它给用户所有权限,在管理界面可以自由进入,常规许可无效。
普通的活跃,非超级用户的管理用户可以根据一套设定好的许可进入。通过管理界面编辑的每个对像有三个许可: 创建 许可, 编辑 许可和 删除 许可。给一个用户授权许可也就表明该用户可以进行许可描述的操作。
注
权限管理系统也控制编辑用户和权限。如果你给某人编辑用户的权限,他可以编辑自己的权限,这种能力可能不是你希望的。
你也可以给组中分配用户。一个 组 简化了给组中所有成员应用一套许可的动作。 组在给大量用户特定权限的时候很有用。
你可以通过很多方法来定制管理界面的外观和行为。在本节我们只谈及与我们 Book 相关的 一些方法,第十七章将讨论定制管理界面的细节问题。
目前为止我们书的改变列表只显示一个字符串,这个字符串是在模式中的 __str__ 中加入来代表这个模式的。这种方式在只有几本书的情况下工作得很好,但如果有成百上千中书的时候,找一本书就像大海捞针。但是我们可以很容易地在界面中加入搜索和过滤功能。改变 Admin 声明如下:
class Book(models.Model): title = models.CharField(maxlength=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() class Admin: **list_display = ('title', 'publisher', 'publication_date')** **list_filter = ('publisher', 'publication_date')** **ordering = ('-publication_date',)** **search_fields = ('title',)**
这四行代码戏剧性地改变了我们的列表界面,如图6-8所示。
WAV4Bz <a href=”http://xffcjccqrjdc.com/“>xffcjccqrjdc</a>, [url=http://xnhmwkaiqsrk.com/]xnhmwkaiqsrk[/url], [link=http://wvubidzachtc.com/]wvubidzachtc[/link], http://cebhekomljne.com/
图 6-8. 修改过的变化列表页面
每一行说明管理界面的不同部分:
list_display 选项控制变更列表所显示的列。缺省情况下变更列表只显示对像包含的 表征字符串。我们在这改变成显示标题,出版商和出版日期。
list_filter 选项在右边创建一个过滤条。我们允许它按日期过滤(它可以让你只显示过去一周,一个月等等出版的书籍)和按出版商过滤。
你可以在管理界面中指定任何域做为过滤器,但是用外键,日期,布尔值和有 choices 属性的域是最适合的。过滤至少显示2个值。
ordering 选项控制对象在管理界面显示时的排序方式。它是想要按序排列的字段的 列表;前面带减号(-)的按逆序排序。在这个例子中,我们按publication date排序, 最近的排在最前。
最后, search_fields 选项创建了一个允许搜索文本内容的域。它可以搜索 title 字段中的内容(所以您可以输入 Django 以显示所有题名中包含有 Django 的书籍)。
通过使用这些选项(还有一些是在十二章描述的)你能够用很少的代码实现很强大,产品级的数据编辑界面。
显然,如果在每个管理页面的头部都包含“Django administration”这行字是搞笑的。这行字只是块标签的占位符。
通过Django模板系统可以很容易的修改它。Django管理站点同样是用Django编写的,它的用户 界面使用Django自己的模板系统。(关于Django模板系统请参见第四章。)
我们在第四章已经讲到, TEMPLATE_DIRS 配置设置了Django加载模板的目录列表。 要自定义Django的管理模板,只需要拷贝Django发行版中的整个管理模板到你在 TEMPLATE_DIRS 里设置的模板目录里。
管理站点的头部区域在模板 admin/base_site.html 里。缺省情况下,这个模板在 Django管理模板目录 django/contrib/admin/templates 里,你可以在Django的安装 目录找到它,例如Python的 site-packages 目录或者你安装的其他目录。要自定义 这个 base_site 模板,把这个模板拷贝到你的模板目录下的 admin 子目录。 例如,假定你的模板目录是 "/home/mytemplates" ,拷贝 django/contrib/admin/templates/admin/base_site.html 到 /home/mytemplates/admin/base_site.html 。不要忘了有 admin 子目录。
然后,编辑这个新 admin/base_site.html 文件,替换你自己站点的名称上去。
备注 每个Django缺省的管理模板都可以重载。要重载一个模板,就象 base_site.html 一样的去做:把它从缺省目录中拷贝到你自己的模板目录中然后修改它。
你可能会想到是这么一回事,如果 TEMPLATE_DIRS 缺省是空的,Django就使用缺省的管理 模板。正确的回答是,缺省情况下,Django自动在每个app里的 templates/ 子目录里搜索 模板来做后备。具体请看第十章中的编写自定义模板加载器章节。
你同样可以自定义Django管理的索引页面(index page)。缺省情况下,它将显示在 INSTALL_APPS 配置里设置的所有应用程序,按应用程序的名称排序。你可能想要修改 排序方式来让你更容易找到你想要的应用程序。毕竟,索引可能是管理界面中最重要的页面, 所以要容易使用才行。
要自定义的模板是 admin/index.html 。(记得象前面例子一样拷贝 admin/index.html 到你的模板目录。)打开这个文件,你会看到一个叫做 {% get_admin_app_list as app_list %} 的模板标签,你可以在这里硬编码你想要的管理页面连接。如果你不喜欢硬编码的方式,请参看 第十章中实现你自己的模板标签章节。
在这里,Django提供了一个快捷方式。运行命令 python manage.py adminindex <app> 来获取可以包含在管理索引模板里的一段代码。这是一个很有用的起点。
有关于Django管理站点自定义的详细内容,请参看第十七章。
sg3FEJ <a href=”http://ywejhwkxcmnr.com/“>ywejhwkxcmnr</a>, [url=http://ihnmhhgbxycf.com/]ihnmhhgbxycf[/url], [link=http://mavsswnqkzlz.com/]mavsswnqkzlz[/link], http://qlsysxiywuco.com/
我们认为Django的管理界面是很有吸引力的。事实上,我们称它为Django的杀手锏之一。当然, 我们也经常被问道 我们 应该在什么情况下使用管理界面,为什么呢?多年实践经验让我们 发现了一些使用管理界面的模式,会对大家很有帮助。
显然,Django管理界面对编辑数据特别有用(难以置信的棒!)。如果你有任何需要输入数据的 任务,管理界面是再合适不过了。我相信大家肯定都有很多要输入数据的任务吧?
Django的管理界面对非技术用户要输入他们的数据时特别有用;事实上这个特性就是专门为这个 实现的。在Django最开始开发的新闻报道的行业应用中,有一个典型的在线自来水的水质专题报道 应用,它的实现流程是这样的:
负责这个报道的记者和要处理数据的开发者碰头,提供一些数据给开发者。
开发者围绕这些数据设计模型然后配置一个管理界面给记者。
在记者输入数据到Django中去的时候,编程人员就可以集中注意力到开发公共访问界面上 (这可是有趣的部分啊!)。
换句话说,Django的管理界面为内容输入人员和编程人员都提供了便利的工具。
当然,除了数据输入方面,我们发现管理界面在下面这些情景中也是很有用的:
检查数据模型 : 在我们定义了数据模型后做的第一件事就是输入一些测试数据。 这可以帮助我们检查数据模型的错误;有一个图形界面可以很快的发现错误。
管理已输入的数据 : 象 http://chicagocrime.org 这样的网站,通常只有少部分 数据是手工输入的,大部分数据是自动导入的。如果自动导入的数据有问题,就可以用管理 界面来编辑它。
现在我们已经创建了一些模式,为编辑数据配置了一个顶尖的界面。在下一章里,我们将要转到真正的网站开发上:表单的创建和处理。
关于本评注系统
本站使用上下文关联的评注系统来收集反馈信息。不同于一般对整章做评注的做法, 我们允许你对每一个独立的“文本块”做评注。一个“文本块”看起来是这样的:
一个“文本块”是一个段落,一个列表项,一段代码,或者其他一小段内容。 你选中它会高亮度显示:
要对文本块做评注,你只需要点击它旁边的标识块:
我们会仔细阅读每个评论,如果可能的话我们也会把评注考虑到未来的版本中去:
如果你愿意你的评注被采用,请确保留下你的全名 (注意不是昵称或简称)
Many, many thanks to Jack Slocum; the inspiration and much of the code for the comment system comes from Jack's blog, and this site couldn't have been built without his wonderful
YAHOO.ext
library. Thanks also to Yahoo for YUI itself.