Writing your first Django app, part 2
这一节主要是讲Django自动生成后台管理网页。
(一)激活管理页面
Django的管理页面默认是不能用的,为了激活管理页面,需要做如下三件事:
1、在INSTALLED_APPS中反注释掉(uncomment) django.contrib.admin
2、运行 python manage.py syncdb ,因为你增加了一个新的应用,所以要更新数据库
3、编辑mysite/urls.py文件,然后反注释引用到admin的行,总共有三处,最后的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)), )
(二)启动服务器
启动服务器:
python manage.py runserver
然后打开网页,输入http://127.0.0.1:8000/admin/,就会看到如下页面:
(三)进入管理网页
然后输入用户名和密码,这里的用户名和密码是我们在第一节创建superuser中的用户名和密码:
(四)让我们的Poll应用也可以加入到管理页面
我们需要告诉管理员Poll对象也有一个管理接口,我们编辑polls/admin.py,改成如下:
重启服务器,再打开刚才的网站,就可以看到Poll对象了
(五)使用admin的功能(略)
(六)定制管理页面
改变编辑页面的属性的顺序:
修改polls/admin.py文件,改为下面的:
创建一个admin的类,作为register的第二个参数,这样的话,poll类的属性顺序就改变了:
我们经常会遇到多个属性,我们可以将他们分为fieldset:
class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Poll, PollAdmin)再次打开Poll页面:
同时可以设置class的collapse属性,将某个fieldset折叠起来:
(七)添加相关对象
虽然我们有了Poll的管理页面,但是一个Poll对于多个Choice,当前的页面并没有看到Choice。
有2种方法解决这个问题,第一种是像注册Poll一样注册一个Choice
from polls.models import Choice admin.site.register(Choice)就可以看到Choice的管理页面了。
为了一次性添加多个Choice,修改admin.py,删除了Choice的register():
from django.contrib import admin from polls.models import Choice, 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:Choice对象是在Poll对象的页面上进行编辑,现在看下添加Poll的页面:
可以看到,Choice可以在Poll页面进行添加了。
同时,为了减小占用的页面空间,Django提供了另一种叫做TabularInline样式的布局:
class ChoiceInline(admin.TabularInline): #...结果如下所示:
(八)定制admin change list
默认,Django显示每个对象的str()值,但是我们有时需要显示对象的所有属性,为了达到这个目的,需要使用list_display这个选项,如下:
class PollAdmin(admin.ModelAdmin): # ... list_display = ('question', 'pub_date', 'was_published_recently')页面效果如下所示:
同时,可以增加一些特性:
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?'
同时增加Filters to PollAdmin:
list_filter = ['pub_date']结果如下:
可以根据日期进行筛选。
我们也可以为某个域添加搜索功能:
search_fields = ['question']这样在顶部产生一个搜索框,根据question的内容进行搜索。
也可以加入一个按照日期继承结果排序的功能:
date_hierarchy = 'pub_date'
(九)定制管理页面的外观
定制项目的模板
在你的项目目录下创建一个模板的文件夹。打开mysite/setting.py ,添加模板的目录:
TEMPLATE_DIRS = ( '/path/to/mysite/templates', # Change this to your own directory. )
然后将Django的默认模板拷到自己项目的template文件夹下:
如果找不到Django目录的话,可以使用如下方法:
python -c " import sys sys.path = sys.path[1:] import django print(django.__path__)"然后改写这个base_site.html即可。
Django的任何默认管理页面的模板都可以被重写,我们只需要将模板文件从Django目录拷贝到我们项目的目录,然后修改即可。
(十)定制管理的主页面
主页面的模板文件是admin/index.html,安装前述方法一样操作即可。