VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > python入门 >
  • python全栈开发中Django的Django管理站点

对于某一类网站, 管理界面 是基础设施中非常重要的一部分。这是以网页和有限的可信任管理者为基础的界面,它可以让你添加,编辑和删除网站内容。你可以用这个界面发布博客,后台的网站管理者用它来润色读者提交的内容,你的客户用你给他们建立的界面工具更新新闻并发布在网站上,这些都是使用管理界面的例子。
458
但是管理界面有一问题:创建它太繁琐。当你开发对公众的功能时,网页开发是有趣的,但是创建管理界面通常是千篇一律的。你必须认证用户,显示并管理表格,验证输入的有效性诸如此类。这很繁琐而且是重复劳动。
python入门教程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**
6
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 。这一步将生成管理界面使用的额外数据库表。
注释
python入门教程在 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/ 在进行的例子中),登录,随便看看。
使用管理界面
1
管理界面的设计是针对非技术人员的,所以它应该是自我解释的。无论如何,有关管理界面特性的一些注释是完善的。
你看到的第一件事是如图6-1所示的登录屏幕。

图 6-1.Django 登录屏幕
你要使用你原来设置的超级用户的用户名和密码。登录以后,你会发现可以管理用户,组和权限(还有更多的东西)。
每一个有 Admin 声明的对象都在主索引页显示,见图 6-2。

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

图 6-3. 典型的改变列表视图
在这些列表里的栏目有不少选项控制,这些显示出一些额外的特性,比如下拉式日期选择控制,搜索栏,过滤界面。我们稍后讨论这些特性的细节。
编辑表格是用来修改现有对像和创建新对像的(见图6-4)。在你模式中定义的域在这里都显示出来,你也许注意到不同类型的域用不同的控件显示(如:日期/时间域有日历控件,外键用选择栏等等)。
1

图 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',)**
python基础教程这四行代码戏剧性地改变了我们的列表界面,如图6-8所示。

图 6-8. 修改过的变化列表页面
每一行说明管理界面的不同部分:
list_display 选项控制变更列表所显示的列。缺省情况下变更列表只显示对像包含的 表征字符串。我们在这改变成显示标题,出版商和出版日期。
list_filter 选项在右边创建一个过滤条。我们允许它按日期过滤(它可以让你只显示过去一周,一个月等等出版的书籍)和按出版商过滤。
你可以在管理界面中指定任何域做为过滤器,但是用外键,日期,布尔值和有 choices 属性的域是最适合的。过滤至少显示2个值。
ordering 选项控制对象在管理界面显示时的排序方式。它是想要按序排列的字段的 列表;前面带减号(-)的按逆序排序。在这个例子中,我们按publication date排序, 最近的排在最前。
最后, search_fields 选项创建了一个允许搜索文本内容的域。它可以搜索 title 字段中的内容(所以您可以输入 Django 以显示所有题名中包含有 Django 的书籍)。
通过使用这些选项(还有一些是在十二章描述的)你能够用很少的代码实现很强大,产品级的数据编辑界面。
定制管理界面的外观和感觉
显然,如果在每个管理页面的头部都包含头部区域代码是搞笑的。它就和Django的模板系统一样, 是块标签的占位符。
通过Django模板系统可以很容易的修改它。Django管理站点同样是用Django编写的,它的用户 界面使用Django自己的模板系统。(关于Django模板系统请参见第四章。)
2
我们在第四章已经讲到, TEMPLATE_DIRS 配置设置了Django加载模板的目录列表。 要自定义Django的管理模板,只需要拷贝Django发行版中的整个管理模板到你在 TEMPLATE_DIRS 里设置的模板目录里。
python基础教程管理站点的头部区域在模板 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/ 子目录里搜索 模板来做后备。具体请看第十章中的编写自定义模板加载器章节。
python基础教程定制管理索引页面
你同样可以自定义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中去的时候,编程人员就可以集中注意力到开发公共访问界面上 (这可是有趣的部分啊!)。
换句话说,Django的管理界面为内容输入人员和编程人员都提供了便利的工具。
当然,除了数据输入方面,我们发现管理界面在下面这些情景中也是很有用的:
§                     检查数据模型 : 在我们定义了数据模型后做的第一件事就是输入一些测试数据。 这可以帮助我们检查数据模型的错误;有一个图形界面可以很快的发现错误。
§                     管理已输入的数据 : 象 http://chicagocrime.org 这样的网站,通常只有少部分 数据是手工输入的,大部分数据是自动导入的。如果自动导入的数据有问题,就可以用管理 界面来编辑它。
相关教程