Django 提供的内置管理控制台是该产品最大的卖点之一。假如您要定制外观和模型字段以外的东西,应该怎么办呢?查看本文了解如何在不修改源程序的情况下扩展现有管理应用程序。
Django admin
Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处。虽然其他 Web 框架也声称能提供同样的内容,但 Django 的独特之处在于它内置了管理应用程序 —— admin。
admin 提供了开箱即用的高级 Create-Read-Update-Delete (CRUD) 功能,减少了重复工作所需的时间。这是许多 Web 应用程序的关键所在,程序员可以在开发时快速浏览他们的数据库模型;非技术最终用户可以在部署时使用 admin 添加和编辑站点内容。
在现实中,总需要执行某些定制操作。关于 admin 外观的基本情况,Django 文档提供许多指南,Django 自身也包含了一些简单的方法用来改写 admin 行为的子集。如果您需要更多功能怎么办呢?从哪里开始着手呢?本文将指导您如何进行一些高级 adimin 定制。
admin 快速浏览
大多数 Django 开发人员都很熟悉 admin 的默认功能。让我们快速回顾一下,首先编辑顶级 urls.py 启用 admin,见清单 1。
清单 1. 在 urls.py 中启用 admin
from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Uncomment the next line to enable the admin: (r'^admin/(.*)', admin.site.root), ) |
|
您还需要将 django.contrib.admin 应用程序添加到 settings.INSTALLED_APPS。
在继续下一步前,建议计划扩展 admin 的用户熟悉一下源代码。对于支持快捷键和符号链接的操作系统,创建一个指向 admin 应用程序的快捷键或符号链接会很有用。
admin 包含在 Django 包中。假如已经使用安装工具安装了 admin,则它位于 django/contrib/admin 下的 site-packages 中。以下是一个项目到 Django admin 源的符号链接样例,您可以根据操作系统和 Django 安装的位置定制,以便更轻松的复制和引用:
$ ln -s /path/to/Python/install/site-packages/django/contrib/admin admin-source
admin.autodiscover() 方法迭代设置 .INSTALLED_APPS 中的每个应用程序,并查找名为 admin.py 的文件。该文件通常位于应用程序目录的最上方,与 models.py 级别一样。
样例应用程序需要清单 2 中提供的 models.py。相应的 admin.py 如下所示。
清单 2. 该应用程序的样例 models.py
from django.db import models class Document(models.Model): '''A Document is a blog post or wiki entry with some text content''' name = models.CharField(max_length=255) text = models.TextField() def __unicode__(self): return self.name class Comment(models.Model): '''A Comment is some text about a given Document''' document = models.ForeignKey(Document, related_name='comments') text = models.TextField() |
现在,您可以通过运行 Django 开发服务器调用 admin:
python manage.py runserver |
admin 可从默认位置 http://localhost:8000/admin/ 获取。登录之后,您可以看到基本的 admin 屏幕,如下所示。
图 1. 基本的 Django admin 屏幕
|
注意,您的模型现在尚不可用,因为您还没有创建 admin.py。清单 3 展示的代码让您能在 admin 中使用模型。
清单 3. 样例 admin.py
from django.contrib import admin from more_with_admin.examples import models class DocumentAdmin(admin.ModelAdmin): pass class CommentAdmin(admin.ModelAdmin): pass admin.site.register(models.Document, DocumentAdmin) admin.site.register(models.Comment, CommentAdmin) |
现在如果您在 admin 中重载主页,您将看到可用的新模型,如下所示。
图 2. 可以支持定制模型的 Django admin
定制 admin 模型页面
|
理解在不修改 Django 源代码的情况下如何定制 admin 的关键在于,记住 admin 像其他程序一样只是一个普通的 Django 应用程序。最重要的一点是,这意味着可以使用 Django 模版继承系统。
Django 的模版搜索顺序总是将您自己项目的模版排在其他系统之前。此外,admin 在恢复到默认情况前,会尝试搜索匹配每个模型的硬编码模版。这为轻松定制提供了一个扩展点。
首先,确保 Django 通过编辑项目的 settings.py 来查看您的模版目录。
清单 4. 编辑 settings.py 以查看模版目录
TEMPLATE_DIRS = ( "/path/to/project/more_with_admin/templates", "/path/to/project/more_with_admin/examples/templates", ) |