Django doc part2 note (django==1.7.1)

本部分主要介绍了与定制 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过来的,初始文件内容如下:

{% 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 中阐述。
转载
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值