===================================== 你的第一个 django 应用程序,第二部分 ===================================== 上接 `Tutorial 1`_ . 继续这个 WEB-民间测验程序,并聚焦于 Django 的自动管理站点 admin . .. _Tutorial 1: http://www.djangoproject.com/documentation/tutorial1/ .. admonition:: 哲学 生成一个 admin 站点给你的同事或客户, 用它来添加,改变及删除内容是相当单调的工作, 嗯,没错,这就是一个没啥创造力的体力活. 基于同样的考虑, Django 很体贴的为你的 model 生成自动的管理界面. Django 是在一个编辑部环境下被发明出来的, 在那个环境里, 内容发布及站点发布是泾渭分明的两件事. 站点管理人员使用这套系统添加新的故事,事件,体育比分等等, 这些内容随即被公开发布. Django 发明了一个统一的接口来解决编辑发布内容的问题. admin 通常没有必要提供给站点用户, 它是为站点管理人员设计的. 激活 admin 站点 ======================= Django admin site 默认是不能使用的 -- 它是可选的. 要激活并使用的,需要以下三个步骤: * 在你的 ``INSTALLED_APPS`` 设置中添加 ``"django.contrib.admin"`` . * 在你新增应用程序到 ``INSTALLED_APPS`` 之后运行 ``python manage.py syncdb`` 以更新数据库. * 编辑 ``mysite/urls.py`` 文件并将 "Uncomment this for admin:" 行下的行解除注释.这个文件是 URLconf; 我们将在下一教程中深入了解 URLconfs.现在你只需要知道怎么做就行了. 启动开发版 WEB 服务器 ============================ 让我们启动开发版WEB服务器并开始遨游 admin 管理站点. 温习一下 Tutorial 1 , 你就知道该这样启动WEB服务器:: python manage.py runserver Now, open a Web browser and go to "/admin/" on your local domain -- e.g., http://127.0.0.1:8000/admin/. You should see the admin's login screen: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin01.png :alt: Django admin login screen 登录 admin site ==================== Now, try logging in. You should see the Django admin index page: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin02t.png :alt: Django admin index page :target: http://media.djangoproject.com/img/doc/tutorial/admin02.png 默认你会看到两个可编辑的内容: groups and users. 这是 Django 自带的核心特性. .. _"I can't log in" questions: http://www.djangoproject.com/documentation/faq/#the-admin-site 让 poll app 可以在 admin 中编辑 ========================================= 我们的 poll app 在哪? 在 admin 索引页中根本看不到它! 只需要做一件事: 我们需要在 ``Poll`` model 中指定 ``Poll`` 对象需要有一个 admin 界面. 编辑 ``mysite/polls/models.py`` 文件并做以下改动:: class Poll(models.Model): # ... class Admin: pass 在 ``class Admin`` 的设置将决定该 model 在 django admin 中如何表现. 所有设置都是可选的.创建一个空的 Admin 类意味着使用所有默认选项. 现在重新载入 Django admin 页. 注意不必重新启动 WEB 服务器 -- 服务器会自动重新载入你的 project,因此在浏览器中你会立马看到你的更改. 自由探索 admin 的功能 ==================================== 现在 ``Poll`` 有内嵌类 ``Admin`` 了, Django 知道如何在 admin 索引页显示它: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin03t.png :alt: Django admin index page, now with polls displayed :target: http://media.djangoproject.com/img/doc/tutorial/admin03.png 点击 "Polls." 现在你处于polls的 "change list" 页. 该页显示数据库中所有的 polls , 并允许你选中一个进行修改. 这是我们在第一个教程中创建的 "What's up?" poll: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin04t.png :alt: Polls change list page :target: http://media.djangoproject.com/img/doc/tutorial/admin04.png 点击 "What's up?" poll 可以编辑它: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin05t.png :alt: Editing form for poll object :target: http://media.djangoproject.com/img/doc/tutorial/admin05.png 注意事项: * 表单是根据 Poll model 自动生成的. * 不同的 model 字段类型 (``models.DateTimeField``, ``models.CharField``) 对应相应的 HTML 输入部件. 每个字段类型都知道如何在 Django admin 中显示. * 每个 ``DateTimeField`` 字段会自动得到 JavaScript 捷径支持. Dates 得到一个 "Today" 捷径及一个弹出式日历. 而 times 得到一个 "Now" 捷径及一个常用时间列表. 在页面的底部提供给你以下选择: * Save -- 保存改变并返回该对象的 change-list 页. * Save and continue editing -- 保存你的改变,并重新载入该对象的 admin 页. * Save and add another -- 保存你的改变并插入一个新的,空的对象.. * Delete -- 显示一个删除确认页. 通过点击 "Today" 和 "Now" 捷径可以改变 "Date published" . 然后点击 "Save and continue editing." 然后点击右上角的 "History" . 你会看到一个页面列出了所有通过 Django admin 对该对象做的改变, 并注意了修改时间及修改人: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin06t.png :alt: History page for poll object :target: http://media.djangoproject.com/img/doc/tutorial/admin06.png 定制 admin 表单 ======================== Take a few minutes to marvel at all the code you didn't have to write. 我们来稍微定制它一下. 我们通过显式的添加一个 ``fields`` 参数给 ``Admin`` 类来自定义字段排列顺序:: class Admin: fields = ( (None, {'fields': ('pub_date', 'question')}), ) 这就使得 "Publication date" 显示在 "question" 前面: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin07.png :alt: Fields have been reordered 仅于两个字段, 这难免让人印象不够深刻, 不过对于 admin 表单拥有成打的字段时, 能够选择一个直观的顺序是相当重要的特性. 既然谈到拥有成打的字段, 你可能会想到将他们分成不同的字段集:: class Admin: fields = ( (None, {'fields': ('question',)}), ('Date information', {'fields': ('pub_date',)}), ) 每个 ``fields`` 子tuple的第一个元素是字段集的标题, 现在我们的表单看起来就是这个样子: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin08t.png :alt: Form has fieldsets now :target: http://media.djangoproject.com/img/doc/tutorial/admin08.png 你可以为每个字段集指定任意的 HTML classes. Django 提供了一个 ``"collapse"`` class 来显示一个初始被卷起来的字段集. 当你有一个不常用但包含一堆字段的很长的表单时会很有用:: class Admin: fields = ( (None, {'fields': ('question',)}), ('Date information', {'fields': ('pub_date',), 'classes': 'collapse'}), ) .. image:: http://media.djangoproject.com/img/doc/tutorial/admin09.png :alt: Fieldset is initially collapsed 添加关联对象 ====================== 不错,我们有了 Poll admin 页. 不过一个 ``Poll`` 对应多个 ``Choices``, 而 admin 页不能显示 choices. 这不算问题,嘿嘿. 有两个方法解决这个问题. 第一种,给 ``Choice`` model 也指定一个内嵌类 ``Admin`` , 就象我们在 ``Poll`` model 中做的一样:: class Choice(models.Model): # ... class Admin: pass 现在 "Choices" 在 Django admin 中也可以编辑了. "Add choice" 表单看起来就象下面这样: .. image:: http://media.djangoproject.com/img/doc/tutorial/admin10.png :alt: Choice admin page 在这个表单里, "Poll" 字段是一个选择框包含数据库中每一个 poll. Django 知道一个 ``ForeignKey`` 应该在 admin 中以一个 ``