The Django Book

第六章:Django管理站点

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 类是空的。

如果你正跟着例子在写你的代码,现在你可以在 PublisherAuthor 类中加入 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所示的登录屏幕。

Django 登录页面的截图。

图 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。

Django 主管理索引截图。

图 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)。

Django 历史页面截图。

图6-6. Django 对像历史页面

当你删除现有对象时,管理界面会要求你确认删除动作以免引起严重错误。删除也是*联级*的:删除确认页面会显示所有将要删除的关联对象(见图6-7)。

Django 删除确认页面截图。

图 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 这样的网站,通常只有少部分 数据是手工输入的,大部分数据是自动导入的。如果自动导入的数据有问题,就可以用管理 界面来编辑它。

下一步是什么?

现在我们已经创建了一些模式,为编辑数据配置了一个顶尖的界面。在下一章里,我们将要转到真正的网站开发上:表单的创建和处理。

Copyright 2006 Adrian Holovaty and Jacob Kaplan-Moss.
This work is licensed under the GNU Free Document License.
Hosting graciously provided by media temple
Chinese translate hosting by py3k.cn.