本部分主要介绍了与定制 admin site (管理界面)的相关知识。
当我们运行web 服务器时,我们可以通过服务器程序的管理界面直接对我们project的database进行修改,可以免去直接写代码的繁琐。本部分让你可以通过加载一些具有特定功能的HTML classes定制属于你的project 管理界面。
1. 定制从属于project的app的管理界面
2. 定制
project的管理界面的html模版
1. 定制从属于project的app的管理界面
假设project中有一个app,app中定义了若干关系(schema)。当你需要在管理界面上管理该关系的tuple时,你需要先在app/admin.py中,注册该关系。如:为polls注册关系Question.
则应在admin.py中加入语句:
admin.site.register(Question)
其实register函数还有第二个参数,目的是为了方便开发者定制关系Question的管理界面。而定制一个app中所有关系的管理界面,最终就等价于定制了该app的管理界面。
以下通过“定制app polls的关系Question的管理界面”来阐述相关的概念:
From file mysite/polls/admin.py:
6 class ChoiceInline(admin.TabularInline):
7 model = Choice
8 extra = 3
9
10 class QuestionAdmin(admin.ModelAdmin):
11 fieldsets =[
12 (None ,{'fields':['question_text']}),
13 ('Date information',{'fields':['pub_date'],'classes':['collapse' ]}),
14 ]
15 inlines=[ChoiceInline]
16 list_display=('question_text','pub_date','was_published_recently');
17 list_filter=['pub_date']
18 search_fields = ['question_text']
19
20 admin.site.register(Question,QuestionAdmin)
line 20 中register的第二个参数为QuestionAdmin,即上面所定义的类,我们正是通过QuestionAdmin类来定制关系Question的管理界面的。姑且称QuestionAdmin为定制类。
line 10中,QuestionAdmin继承自类admin.ModelAdmin,admin模块的ModelAdmin类是所有定制类的父类。
line 11中,列表fieldsets中有两个tuple,这两个tuple分别对应于question_text 和 pub_date的界面。每个元组的第一个元素对应于管理界面上的title,'fields'后面的列表中存储Field。'classes'后面的列表中存储一些HTML类。
列表fieldsets的第二个元组中,加入了HTML类 'collapse',它会在管理界面上隐藏pub_date这个field,要通过人为点击才能展开。
我们也可以不用fieldsets,转而用列表field来存储:
fields = ['pub_date', 'question_text']
不过这样一来,每个field就不能有自己的title了,每个field也不能使用HTML类来实现一些额外的功能了。
line 15中,列表inlines定义当需要增加新的Question元组时,管理界面应作出的相应。在本例中,只需作出类ChoiceInline中定义的相应---当新增一个Question元组时,增加3个Choice元组。
line 16中,元组list_display定义了:每个Question元组有3列元素,而这三列元素的表头就是list_display中的那三个元素。注意到第三个元素为'was_published_recently',这是Question关系中定义的一个方法。由于方法的返回值是未知的。Django的list_display默认对加入方法的名字没有定义。所以,我们必须手动为方法 was_published_recently添加 关于list_display的定义:
From file mysite/polls/models.py
12 def was_published_recently(self):
13 return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
14 was_published_recently.admin_order_field='pub_date'
15 was_published_recently.boolean = True
16 was_published_recently.short_description = 'published recently?'
上面的14,15,16行即我们添加的定义。short_description中定义的字符串就是为方法'was_published_recently'定义的表头名字。
效果图如下所示:
line 17中,list_filter用于在管理界面上,产生一个筛选框,以筛选所需的Question元组。本例中的筛选条件即'pub_date'。
line 18中,search_fields用于在管理界面上,产生一个搜索框,以搜索所需的Question元组。本例中的搜索关键字即'question_text'中的文本。
效果图如下所示:
2. 定制project的管理界面的html模版
在运行服务器并进入你的project管理界面的时候,相信你一定看到了,上面抬头的Django Administration,是不是觉得很挫?! 下面介绍的内容可以帮助你定制整个project的管理界面,包括去掉上面的抬头。。。
前面我们提到过,我们会将project需要的app注册在settings.py文件中。而且,管理界面的模版正是从这些app的路径中查找得来的。要定制自己的模版,我们需要为列表变量TEMPLATE_DIRS指定自定义模版的路径。当没有指定的时候,Django会从"INSTALL_APPS"这个元组中试探是否包含/templates子目录。(本例中的默认模版路径是app 'django.contrib.admin'的子目录templates, 我的机器上的完整路径是
/Library/Python/2.7/site-packages/django/contrib/admin/templates
)
若有,则视为模版来源。我们现在要做的,就是在相应目录下创建/templates子目录,并放入我们定义的html。在本例中,我的模版放在这个目录下:
/Users/user/projects/mysite/templates/admin
在这个目录下,有一个base_site.html文件,是从默认模版路径下copy过来的,初始文件内容如下:
1 {% extends "admin/base.html" %}
2
3 {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
4
5 {% block branding %}
6 <h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default: _('Django administration') }}</a></h1>
7 {% endblock %}
8
9 {% block nav-global %}{% endblock %}
我只是将line 6 包含变量 "site_header" 的那一句替换成了以下这句而已:
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a ></h1>
刷新服务器的管理界面,我们的抬头就变成了"Polls Administration"了。
同样的,你也可以自行定制index.html等等html模版。有关html语句的语法格式及意义会在part 3 中阐述。