Django管理站点

对于某一类网站,管理界面是基础设施中非常重要的一部分。这是以网页和有限的可信任管理者为基础的界面,它可以让你添加,编辑和删除网站内容。你可以用这个界面发布博客,后台的网站管理者用它来润色读者提交的内容,你的客户用你给他们建立的界面工具更新新闻并发布在网站上,这些都是使用管理界面的例子。


但是管理界面有一问题:创建它太繁琐。当你开发对公众的功能时,网页开发是有趣的,但是创建管理界面通常是千篇一律的。你必须认证用户,显示并管理表格,验证输入的有效性诸如此类。这很繁琐而且是重复劳动。

Django 在对这些繁琐和重复的工作进行了哪些改进?它用不能再少的代码为你做了所有的一切。Django中创建管理界面已经不是问题。

这一章是关于 Django的自动管理界面。这个特性是这样起作用的:它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即工作。在这里我们将讨论如何激活,使用和定制这个特性。

激活管理界面

我们认为管理界面是 Django中最酷的一部分,大部分 Django用户也这么想。但是不是所有人都需要它,所以它是可选的。这也就意味着你需要跟着三个步骤来激活它。

在你的模式中加入管理元数据。

不是所有的 model能够(或应该)被管理者编辑,所以你需要标出哪些模式应该有管理界面。你通过在你的模式中添加Admin类(如果原来你定义过Meta类的话,就在下面添加)。给上一章我们的Book模式添加管理界面,我们这样做:

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之下你可以放很多选项,但目前我们只关注缺省的东西,所以我们只在那写上passPython 知道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。这一步将生成管理界面使用的额外数据库表。

注释

INSTALLED_APPS里有"django.contrib.auth"的情况下,当你第一次运行syncdb时会被问是不是需要创建超级用户。如果你在那时不做这个事情,你需要运行django/contrib/auth/bin/create_superuser.py来创建有管理权的用户。否则你不可能登录进管理界面。

在你的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.

现在你可以访问 Django给你的URL (http://127.0.0.1:8000/admin/在进行的例子中),登录,随便看看。

使用管理界面


管理界面的设计是针对非技术人员的,所以它应该是自我解释的。无论如何,有关管理界面特性的一些注释是完善的。

你看到的第一件事是如图6-1所示的登录屏幕。

6-1.Django登录屏幕

你要使用你原来设置的超级用户的用户名和密码。登录以后,你会发现可以管理用户,组和权限(还有更多的东西)。

每一个有Admin声明的对象都在主索引页显示,见图 6-2

6-2Django主管理索引

添加和更改对像的链接将导出两个页面,这两个页面是指向更改列表编辑表格两个对像。如图6-3所示,更改列表主要是系统对像的索引页面。

6-3.典型的改变列表视图

在这些列表里的栏目有不少选项控制,这些显示出一些额外的特性,比如下拉式日期选择控制,搜索栏,过滤界面。我们稍后讨论这些特性的细节。

编辑表格是用来修改现有对像和创建新对像的(见图6-4)。在你模式中定义的域在这里都显示出来,你也许注意到不同类型的域用不同的控件显示(如:日期/时间域有日历控件,外键用选择栏等等)。


6-4.典型的编辑表格

你还能看到管理界面也控制着你输入的有效性。你可以试试不填必需的栏目或者在时间栏里填错误的时间,你会发现当你要保存时会出现错误信息,如图6-5所示。

6-5. 编辑表格显示错误信息

当你编辑已有的对像时,你在窗口的右上角可以看到一个历史按钮。通过管理界面做的每一个改变都留有记录,你可以按历史键来检查这个记录(见图6-6)。

6-6. Django对像历史页面

当你删除现有对像时,管理界面会要求你确认删除动作以免发生代价不菲的错误。删除也是*联级*的:删除确认页面会显示所有将要删除的关联对像(见图6-7)。

6-7. Django删除确认页面

用户、组和许可

因为你是用超级用户登录的,你可以创建,编辑和删除任何对像。然而管理界面有一个用户许可系统,你可以用它来给其它用户授与他们需要的部分权力。

你通过管理界面编辑用户及其许可就像你编辑别的对像一样。用户模式的链接和你自己定义的所有对像一样列在管理索引页面。

用户对像有你期望的标准用户名,密码,e-mail和真实姓名域,同时它还有在管理界面里这个用户可以做什么。首先,这有一组三个标记:

§ 这是激活标志,它用来控制用户是否已经激活。如果这个标志关闭,这个用户就不能浏览任何需要登录的URL

§ 这是成员标志,它用来控制这个用户是否可以登录管理界面(如:这个用户是不是你组织的成员)。由于同一个用户系统也用来控制公共(如:非管理)站点的访问(见十二章),本标志区分公共用户和管理员。

§ 这是超级用户标志,它给用户所有权限,在管理界面可以自由进入,常规许可无效。

普通的活跃,非超级用户的管理用户可以根据一套设定好的许可进入。通过管理界面编辑的每个对像有三个许可:创建许可,编辑许可和删除许可。给一个用户授权许可也就表明该用户可以进行许可描述的操作。

权限管理系统也控制编辑用户和许可。如果你给某人编辑用户的权限,他可以编辑自己的权限,这种能力可能不是你希望的。

你也可以给组中分配用户。一个简化了给组中所有成员应用一套许可的动作。组在给大量用户特定权限的时候很有用。

定制管理界面

你可以通过很多方法来定制管理界面的外观和行为。在本节我们只谈及与我们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所示。

6-8.修改过的变化列表页面

每一行说明管理界面的不同部分:

list_display选项控制变更列表所显示的列。缺省情况下变更列表只显示对像包含的表征字符串。我们在这改变成显示标题,出版商和出版日期。

list_filter选项在右边创建一个过滤条。我们允许它按日期过滤(它可以让你只显示过去一周,一个月等等出版的书籍)和按出版商过滤。

你可以在管理界面中指定任何域做为过滤器,但是用外键,日期,布尔值和有choices属性的域是最适合的。过滤至少显示2个值。

ordering选项控制对象在管理界面显示时的排序方式。它是想要按序排列的字段的列表;前面带减号(-)的按逆序排序。在这个例子中,我们按publication date排序,最近的排在最前。

最后,search_fields选项创建了一个允许搜索文本内容的域。它可以搜索title字段中的内容(所以您可以输入Django 以显示所有题名中包含有 Django的书籍)。

通过使用这些选项(还有一些是在十二章描述的)你能够用很少的代码实现很强大,产品级的数据编辑界面。

定制管理界面的外观和感觉

显然,如果在每个管理页面的头部都包含头部区域代码是搞笑的。它就和Django的模板系统一样,是块标签的占位符。

通过Django模板系统可以很容易的修改它。Django管理站点同样是用Django编写的,它的用户界面使用Django自己的模板系统。(关于Django模板系统请参见第四章。)


我们在第四章已经讲到,TEMPLATE_DIRS配置设置了Django加载模板的目录列表。要自定义Django的管理模板,只需要拷贝Django发行版中的整个管理模板到你在TEMPLATE_DIRS里设置的模板目录里。

管理站点的头部区域在模板admin/base_site.html里。缺省情况下,这个模板在 Django管理模板目录django/contrib/admin/templates里,你可以在Django的安装目录找到它,例如Pythonsite-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的管理界面是很有吸引力的。事实上,我们称它为Django的杀手锏之一。当然,我们也经常被问道我们应该在什么情况下使用管理界面,为什么呢?多年实践经验让我们发现了一些使用管理界面的模式,会对大家很有帮助。

显然,Django管理界面对编辑数据特别有用(难以置信的棒!)。如果你有任何需要输入数据的任务,管理界面是再合适不过了。我相信大家肯定都有很多要输入数据的任务吧?

Django的管理界面对非技术用户要输入他们的数据时特别有用;事实上这个特性就是专门为这个实现的。在Django最开始开发的新闻报道的行业应用中,有一个典型的在线自来水的水质专题报道应用,它的实现流程是这样的:

§ 负责这个报道的记者和要处理数据的开发者碰头,提供一些数据给开发者。

§ 开发者围绕这些数据设计模型然后配置一个管理界面给记者。

§ 在记者输入数据到Django中去的时候,编程人员就可以集中注意力到开发公共访问界面上

换句话说,Django的管理界面为内容输入人员和编程人员都提供了便利的工具。

当然,除了数据输入方面,我们发现管理界面在下面这些情景中也是很有用的:

§ 检查数据模型:在我们定义了数据模型后做的第一件事就是输入一些测试数据。这可以帮助我们检查数据模型的错误;有一个图形界面可以很快的发现错误。

§ 管理已输入的数据:http://chicagocrime.org这样的网站,通常只有少部分数据是手工输入的,大部分数据是自动导入的。如果自动导入的数据有问题,就可以用管理界面来编辑它。


转载请注明文章出处:http://blog.csdn.net/wolaiye320/article/details/51865630

你可能感兴趣的:(python,django)