【译】本身动手写Django app,第二部分【完】

原文地址: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结束!
相关文章
相关标签/搜索