编写你的第一个Django程序,第二部分
本文接续第一部分。我们会继续开发网页投票程序,并深入研究Django自动生成后台的功能。
哲理
为你的员工或客户创建后台来管理内容是一件不需要什么创意的乏味工作。因为这个原因,Django为模型对象有一套完整的自动创建管理界面的机制。
Django是在一个新闻编辑部里诞生的,在这个环境下在“内容编辑”和“公众网站”之间有很明显的分界线。网站管理员使用这个系统来增加新闻内容、时间、体育赛事报道等等,而这些内容会在公众网站上展示出来。Django为网站管理员提供了一个统一的管理界面。
管理工具不是让网站访问者来使用的;它是为了网站管理员而准备的。
启用管理后台
默认情况下Django管理后台是不启用的——它是可选的。要启用管理后台,要做三件事:
l 在INSTALLED_APPS设置中加入django.contrib.admin。
l 运行python manage.py syncdb。因为你在INSTALLED_APPS中加入了一个新程序,数据表需要更新。
l 编辑mysite/urls.py文件,并将“Uncomment the next two lines...”下面的部分取消注释。这个文件是URL配置文件;我们会在后面的部分深入URL配置。现在你所需要知道就是它将URL映射到代码中。最后你保存的url.py文件应该向下面这样:
Django开发版本中有更改:添加管理后台的URL的方法在Django1.1中已经改变。
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^mysite/', include('mysite.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
(r'^admin/', include(admin.site.urls)),
)
粗体的部分就是要取消注释的代码。
启动开发服务器
我们来启动开发服务器,看看管理后台是什么样的。
复习第一部分,启动服务器需要用到下面的命令:
python manage.py runserver
现在打开浏览器,在本地域名上访问/admin/——例如http://127.0.0.1:8000/admin/。你就会看到下面的登录界面:
进入管理后台
现在试试登录进去(还记得不?前面你已经创建了一个超级用户的账户)。你能看到Django管理后台的首页:
你会看到几块能够进行编辑的内容,包括Gourps、Users、Sites。这些都是Django默认的特性。
让投票程序的数据可编辑
但是投票程序显示在哪里?在管理后台的首页上没有显示出来。
只需要做一件事:我们要告诉管理后台Poll对象要有个管理界面。在polls文件夹下创建一个admin.py文件,加入下面的代码:
from mysite.polls.models import Poll
from django.contrib import admin
admin.site.register(Poll)
重启服务器后,你就能看到改变。正常情况下,当你修改一个文件的时候,服务器会重新加载代码;但是添加一个文件并不会重新加载。
体验管理功能
现在我们在管理后台中注册了Poll模型,Django就知道要在后台首页上显示出来了:
点击“Poll”。现在你看到一个投票数据的列表页面了。这个页面显示了数据库中所有投票数据,你可以点击一个进行修改。刚才我们有个“What’ up”的投票选项:
点击它进行编辑:
有几点需要注意:
l 表单是根据Poll模型自动生成的。
l 不同的字段类型(DateTimeField、CharField),在页面上会有不同HTML元件来展示。在Django管理后台中,每个字段都有自适应的展现方式。
l 每个DateTimeField都有JavaScript快捷方式。日期有“Today”快捷方式和日期控件弹出框,时间有“Now”快捷方式和常用时间选项弹出框。
页面的底部有一些可选操作:
l Save——保存当前改变,回到列表页面。
l Save and continue editing——保存当前改变,重新载入当前编辑数据。
l Save and add another——保存当前改变,加载一个新的空表单。
l Delete——显示删除确认页面。
点击“Today”和“Now”快捷方式修改“Date published”字段。然后点击“Save and continue editing”。接着点击右上角的“History”,你会看到当前记录所有的修改历史,包括了修改的时间和操作的用户:
定制管理表单
感叹一下吧,你不用写多少代码就能有个管理后台了。当你调用admin.site.register(Poll)时,Django让你可以编辑它的内容,并能够“猜测”怎样展示这个对象。你常常要考虑管理界面的界面和功能,只需要在注册对象的时候告诉Django对应的设置就可以了。
我们来看看怎样在编辑表单上给字段重新排序。把admin.site.register(Poll)这一行做如下的替换:
class PollAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question']
admin.site.register(Poll, PollAdmin)
你要遵循这种规范——创建一个管理模型对象,把它作为admin.site.register()的第二个参数传入——当你要改变这个对象的管理设置时。
刚才的改变让“Publication date”字段排在了“Question”字段前面:
这对于只有两个字段的模型来说,给你的体验不会太深,但是在一个有很多字段的管理表单里,选择一个直观的排序方式是非常重要的细节。
刚才提到了多字段的表单,你可能想把这些字段都分成一个个组里去,下面的代码可以做到:
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Poll, PollAdmin)
在fieldsets中每个元组的第一个元素就是组的标题。现在我们的表单看起来就像是这样的:
你可以给每个组加上HTML样式。Django提供了“collapse”样式,使用这个样式的组初始时是收缩的。当你的表单中有个组包含了很多不常用的字段时,这个样式是很有用的:
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]