原文地址:https://docs.djangoproject.com/en/1.4/intro/tutorial02/ html
这个教程从教程一留下的东西开始的。咱们继续网络调查应用程序同时咱们将会关注Django的自动生成的管理站点。 python
(哲学:为你的员工或者客户生成增长,修改或删除内容的站点是一个枯燥无味的工做,由于这不须要太多的创造性。因为这个缘由,Django彻底自动为模型建立管理接口。Django是在新闻编辑室的环境中开发出来的,当时在“内容发布”和“发布”站点上有一个很明确的区分。站点管理是用系统来增长新的故事,事件,运动得分等等,这些内容发布在公共站点上。Django经过建立一个统一的接口方便管理员编辑内容解决了这一问题。管理站点不是为网站的访问者准备的,它是为网站管理者准备的。) 数据库
1、激活管理站点 django
默认状况下Django不激活管理站点——这是一个选择的东西。为你的程序激活管理站点,作下面三件事: 编程
在INSTALLED_APPS设置中取消“django.contrib.admin”的注释。 浏览器
运行python manage.py syncdb。由于你向INSTALLED_APPS增长了新的应用程序,数据库的表须要更新。 服务器
编辑mysite/urls.py文件,在提到admin的那一行去掉注释——这里总共有三行要取消注释。这个文件是URL配置文件。在下一个教程中咱们将深刻学习URL配置文件。如今,你只须要知道它映射根URL到你的应用程序。最后你应该有一个像下面同样的urls.py文件: 网络
from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', '{{ project_name }}.views.home', name='home'), # url(r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), )
2、启动开发服务器 app
让咱们启动开发服务器来探索管理站点。 函数
像教程1中同样经过python manage.py runserver来启动开发服务器,如今在打开浏览器在你本地域名后“/admin/”的地方——好比说,http://127.0.0.1:8000/admin/。你应该看到管理员登录界面:
(和你看到的不同?:若是这个时候你获得的不是上面的登录页面,而是错误页面报告的页面就像:
ImportError at /admin/ cannot import name patterns ...那么可能你使用的Django版本和这个教程版本不匹配。你要吗换到更老的教程或者更新的Django版本。)
3、进入管理站点
如今,尝试着登录。(你已经在教程1建立了一个超级帐户,还记得吗?若是你没有建立或者忘记了密码,你能够再建立一个用户。)你应该看到Django的管理索引页面:
你应该能看到一些编辑内容的东西,包括组,用户和网站。这些默认状况下是Django的核心特征。
4、使调查程序在管理站点中能够修改
可是咱们的调查程序在什么地方呢?它尚未在管理索引页面显示出来。
只须要作一件事:咱们须要告诉管理站点Poll对象有一个管理接口。为了这样,你能够在polls目录下建立一个叫admin.py文件,编程成下面形式:
from polls.models import Poll from django.contrib import admin admin.site.register(Poll)
你须要从新启动开发服务器才能看到这些改变。正常状况下,服务器在你每次修改文件时会自动从新加载代码,可是建立一个新的文件的行为不触发自动加载逻辑。
5、探索管理站点的功能
如今咱们已经注册了Poll对象,Django知道它应该在管理索引页面显示出来:
点击”Polls“,如今你在调查程序的”change list“页面了。这个页面显示你数据库中全部的调查,让你能够选择任何一个来改变它。这里有一个咱们在教程1建立的“What's up?”调查:
点击“What's up?”来编辑它:
这里须要注意的事情:
表单是Poll模型自动生成的;
不一样的模型的空间类型(DataTimeField,CharField)对应着相关的HTML输入部件,每一个空间类型知道如何在Django管理页面中显示它本身;
每一个DateTimeField能得到一个免费的JavaScript的快捷方式。日期得到一个“Today”的快捷方式和日历弹出对话框,时间得到一个“Now”快捷方式和一个方便的列举经常使用进入时间的对出框;
页面底部给你许多选项:
Save——保存改动,然会返回这种对象类型的改动列表页面;
Save and continue editing——保存改动,从新载入对象管理页面;
Save and add another——保存改动,载入一个这种对象类型的新的空白表单;
Delete——显示一个删除确认页面;
若是“Date published”的值和你在教程1中建立的时间不相同,这可能意味着你忘记了TIME_ZONE的正确值了。修改它,而后从新载入页面检查正确的值是否出现了。
经过点击“Today”和“Now”快捷方式来改变“Date published”。而后点击“Save and continue editing”。而后在右上方点击历史,你能够看到一页列满了经过Django管理站点对这个对象的改动,同时还带有时间戳和改动的用户:
6、定制管理站点表单
花几分钟时间看看你这神奇的代码,虽然你不须要写。经过用admin.site.register(Poll)注册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)领域块中每一个元组的第一个元素是领域块的标题,下面是咱们的表单外观:
你能够给每一个领域块分配绝对的HTML类。Django在初始时提供一个“collapse”类来显示特别地领域块。当你有一个很长而且包含许多不经常使用的领域的表单时这颇有效:
class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ]
7、增长相关对象
好了,咱们有一个Poll对象管理站点页面,可是一个Poll有多个Choices,可是管理站点页面没有显示选择。可是这里有2种方法解决这个问题,第一个是就像咱们处理Poll对象同样在admin里注册Choice,这很简单:
from polls.models import Choice admin.site.register(Choice)如今,“Choices”在Django的管理页面上能够选择了。“Add choice”表单看起来应该像这样:
在这个表单中,“Poll”区域是数据库中包含每一个调查的选择框,Django知道ForeignKey在管理站点中应该做为一个<select>框,在咱们的例子中,如今只有一个调查记录存在。
同时注意到“Add Another”连接到下一个“Poll”,每个拥有ForeignKey关系的对象都能自动这样。当你点击“Add another”,你能够看到一个带有“Add poll”表单的弹出对话框。若是你在这个对话框中增长一个调查记录而后点击“Save”,Django会把这个调查记录保存到数据库,并自动把它加到你在“Add another”下方便你能够作出选择。
但实际上,这种方法向系统增长对象是效率不高的。最好是在建立Poll对象时你能直接增长一些列Choices,让咱们实现这个:
删除Choice模型的register()调用函数,而后编辑Poll注册代码以下:
class ChoiceInline(admin.StackedInline): model = Choice extra = 3 class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline] admin.site.register(Poll, PollAdmin)这会告诉Django:“在Poll管理站点页面上Choice对象时可编辑的,默认状况下,为三个选择提供作够的区域。”
从新载入”Add poll”页面去看看效果,可能你须要重启你的开发服务器:
它就是像这样的。对相关的Choices有三个位置(做为额外特别的),每次你来到一个已经建立的对象的“Change”页面上你,亦能够看到三个额外的位置。
在这三个目前的位置下面你能够找到一个“Add another”连接,若是你点击它,将会建立一个新的位置。若是你想删除增长的位置,你能够点击增长位置右上角的X。注意,你不能删除原始的三个位置。下面显示的是增长了位置的图片:
可是有个小的问题。为进入相关Choice对象已经花了许多屏幕空间用来些事这些领域。因为这个缘由,Django提供了显示内联相关对象的表格方式,你须要改变ChoiceInline成下面的样子:
class ChoiceInline(admin.TabularInline): #...有了这个TabularInline(而不是StackedInline),相关对象以更紧凑、基于表格格式显示出来:
如今这里有一个额外的“Delete?”栏可让你删除你用“Add Another Choice”按钮建立并已经保存的行。
8、定制管理站点改动列表
如今Poll管理站点页面看起来还行,就让咱们对“change list”(显示系统中全部的调查)作一些调整。
下面是如今站点的样子:
默认状况下,Django显示每一个对象的str()。可是有时候当咱们想显示我的区域时可能更有用。为了实现这个,咱们使用list_display管理选项(这是用来显示的区域名字的元组)在对象改动列表页面做为列:
class PollAdmin(admin.ModelAdmin): # ... list_display = ('question', 'pub_date')为了完善措施,让咱们也把教程1的was_published_recently方法加进来:
class PollAdmin(admin.ModelAdmin): # ... list_display = ('question', 'pub_date', 'was_published_recently')如今调查改动列表页面看起来是这样子的:
你能够点击列的标题把这些内容排序(除了was_published_recently列的标题,由于暂不支持绝对方法输出排序)。注意默认状况下was_published_recently列的标题是方法(用下划线替代空格)的名字,每一行包含输出字符串的表示。
你能够像下面同样给方法(在models.py里)一些属性来改善上述现象:
class Poll(models.Model): # ... def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) was_published_recently.admin_order_field = 'pub_date' was_published_recently.boolean = True was_published_recently.short_description = 'Published recently?'再次编辑你的admin.py文件,想Poll改动列表页面增长一个完善:过滤器。把下面的东西增长到PollAdmin:
list_filter = ['pub_date']这就增长了一个“Filter”边栏让人按照pub_date过滤改动列表:
过滤器显示的种类依赖于你使用过滤器的区域的类型。由于pub_date是DateTimeField,Django知道给一个合适的过滤器选项:“Any date”,“Today”,“Past 7 days”,“This month”,“This year”。
一切进展的都比较顺利。让咱们增长一些搜索功能:
search_fields = ['question']这是在改动列表的顶部增长了一个搜索框。当有人输入搜索条件是,Django会搜索question区域,你能够用你喜欢用的许多区域,尽管由于这是在屏幕后面使用了一个LIKE查询是数据库稳定工做。
最后,由于Poll对象有日期,所以日期的降序排列会更方便。增长下面这行:
date_hierarchy = 'pub_date'这在改动列表页面的顶部增长了一个按照日期的层次结构。在最上层,它显示全部存在的年。而后向下是月,最终是日。
注意改动列表给了你一个页码。默认状况下每页显示100条记录。改动列表分页,搜索框,过滤器,时间层次结构和列排列都像预期中预期的那样工做。
9、定制管理页面的外观和感受
很明显,在每一个管理页面的顶部有个“Django administration”是很荒唐的。实际上这是放置文本的地方。
可是,使用Django的模板系统很容易改变这个。Django管理系统是由Django本身支持的,它的接口也是Django本身的模板系统。
打开你的设置文件(mysite/settings.py)查看TEMPLATE_DIRS设置。TEMPLATE_DIRS是一个用来检测合适载入Django模板的系统文件目录的元组。它是一个搜索路径。
默认状况下,TEMPLATE_DIRS是空的,所以,让咱们给它增长一行告诉Django咱们的模板在什么地方:
TEMPLATE_DIRS = ( '/home/my_username/mytemplates', # Change this to your own directory. )如今从默认Django的管理模板目录下(Django自身的源代码,django/contrib/admin/template)把 admin/base_site.html拷贝到一个你正在使用的TEMPLATE_DIRS的admin子目录下。好比说,若是你的 TEMPLATE_DIRS是'/home/my_username/mytemplate',像上面说的同样,把django/contrib /admin/templates/base_site.html拷贝到/home/my_username/mytemplates/admin /base_site.html。不要忘记这是一个admin子目录。
(Django源代码文件在哪?:若是找你系统上的Django的源文件有困难,运行下面的命令:
python -c " import sys sys.path = sys.path[1:] import django print(django.__path__)"而后只要编辑而后用你本身想用的网站名字替代生成Django的文本。
这个模 板文件包含许多像{% block branding %}和{{ title }}。{%he {{是Django的模板语言的部分标记。当Django提供了admin/base_site.html时,模板语言会自动生成最后的HTML页面。现 在不要担忧你一点都看不懂模板——在教程3中咱们会深刻讲解Django的模板语言。
如今任何Django默认都管理模板都是能够重写的。为了重写一个模板,只要作你对base_site.html作的事情同样就好了——把它从默认地方拷贝到你定制的目录,而后作出相应的改动。
可是机敏的读者会问:若是TEMPLATE_DIRS是空的话,Django怎么找到默认的管理模板呢?其实,默认状况下,Django会在每一个应用程序包的templates/子目录下去查找的,做为一个后备。所有信息详见模板载入文档。
10、定制管理索引页面
一个相似的要注意的东西,你可能想定制Django管理索引页面的外观和感受。
默认状况下,系统按照字母表的顺序显示已经在管理应用程序中注册的INSTALLED_APPS。你可能像对整个布局作出重大改变。毕竟,索引页面可能对管理页面来讲是最重要的页面,并且它应该容易使用。
要 定制的莫办事admin/index.html。(就像在前一个部分处理admin/base_site.html同样——从默认的目录复制到你定制模板 的目录。)编辑文件,而后你就能看到它用了一个叫app_list的模板变量。这个变量包含了Django安装的每一个应用程序。这并非使用它,而是你可 以随意用代码把它和明确对象的管理页面相关联。再次,不要担忧你不懂模板语言——在教程3中将会涉及到它。
当你据对管理页面适应了,读教程3开始公共调查的视图。
教程2结束!