激活管理界面:
- django.contrib 包:django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,管理工具是django.contrib的第一个部分。从技术层面上讲,它被称作django.contrib.admin。
django.contrib中其它可用的特性,如用户鉴别系统(django.contrib.auth)、支持匿名会话
(django.contrib.sessioins)以及用户评注系统(django.contrib.comments)。
- 对settings文件做如下这些改变:
1)将
'django.contrib.admin'加入setting的
INSTALLED_APPS配置中,
INSTALLED_APPS中的配置顺
序是没有关系的。
2)保证
INSTALLED_APPS中包含
'django.contrib.auth',
'django.contrib.contenttypes'和
'django.contrib.sessions',Django的管理工具需要这3个包。
3)确保
MIDDLEWARE_CLASSES 包含
'django.middleware.common.CommonMiddleware' 、
'django.contrib.sessions.middleware.SessionMiddleware' 和
'django.contrib.auth.middleware.AuthenticationMiddleware' 。
- 运行 python manage.py syncdb 。这一步将生成管理界面使用的额外数据库表。 当你把'django.contrib.auth'加进INSTALLED_APPS后,第一次运行syncdb命令时, 系统会请你创建一个超级用户。 如果你不这么作,你需要运行python manage.py createsuperuser来另外创建一个admin的用户帐号,否则你将不能登入admin。
- 将admin访问配置在URLconf(记住,在urls.py中). 默认情况下,命令django-admin.py startproject生成的文件urls.py是将Django admin的路径注释掉的,你所要做的就是取消注释:
(r'^admin/', include(admin.site.urls)),
|
- 启动开发服务器(如前:"python manage.py runserver 0.0.0.0:8000" ),然后在浏览器中访问:
管理界面操作:- 将Models加入到Admin管理中:继续第五章中的“book”例子。在其中,定义了三个模块: Publisher、Author和Book。在“books”目录下(“mysite/books”),创建一个文件:“admin.py”,然后输入以下代码:
from django.contrib import admin
from mysite.books.models import Publisher,Author,Book
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)
|
- 设置字段可选:想要Author模块中的email字段成为可选,即允许不填,你只要编辑Book模块(它在mysite/books/models.py文件里),在email字段上加上blank=True。代码如下:
email = models.EmailField(blank=True) |
为了消除歧义,Django生成
CREATE TABLE语句自动为每个字段显式加上
NOT NULL。在管理工具中,如
果你留空一个字符型字段,它会为此插入一个空字符串(而* 不是*
NULL)。但是,其它数据类型有例
外:日期型、时间型和数字型字段不接受空字符串。因此,如果你想允许一个日期型(
DateField、
TimeField、
DateTimeField)或数字型(
IntegerField、
DecimalField、
FloatField)字段为空,你需
要使用
null=True 和
blank=True:
publication_date = models.DateField(blank=True, null=True)
|
要完成这些改动,还需要更新数据库。出于某种原因,Django不会尝试自动更新数据库结构。所以你
必须执行
ALTER TABLE语句将模块的改动更新至数据库。可以使用
manage.py dbshell进入数
据库服务环境。
以下是在这个特殊情况下如何删除
NOT NULL:
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
|
注意:以上SQL语法是PostgreSQL特有的。
- 自定义字段标签:在编辑页面中,每个字段的标签都是从模块的字段名称生成的。 规则很简单: 用空格替换下划线;首字母大写。例如:Book模块中publication_date的标签是Publication date。将Author.email的标签改为e-mail,中间有个横线:
email = models.EmailField(blank=True, **verbose_name='e-mail'** )
|
注:Django会自动适时将首字母大写,并且在其它不需要大写的地方使用
verbose_name的精确值。
为了使语法简洁,你可以把它当作固定位置的参数传递,但这不适用于
ManyToManyField 和
ForeignKey 字段,因为它们第一个参数必须是模块类。
email = models.EmailField(**'e-mail',** blank=True)
|
- 自定义ModelAdmi类:为Author模块定义一个ModelAdmin类。打开admin.py并修改:
from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
**class AuthorAdmin(admin.ModelAdmin):**
**list_display = ('first_name', 'last_name', 'email')**
admin.site.register(Publisher)
**admin.site.register(Author, AuthorAdmin)**
admin.site.register(Book)
|
接下来,添加一个快速查询栏。 向
AuthorAdmin追加
search_fields,如:
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
**search_fields = ('first_name', 'last_name')**
|
为
Book列表页添加一些过滤器:
**class BookAdmin(admin.ModelAdmin):**
**list_display = ('title', 'publisher', 'publication_date')**
**list_filter = ('publication_date',)**
admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
**admin.site.register(Book, BookAdmin)**
|
另外一种过滤日期的方式是使用
date_hierarchy选项,如:
class BookAdmin(admin.ModelAdmin):
... ...
date_hierarchy = 'publication_date'
|
最后,让我们改变默认的排序方式,按publication date降序排列。 列表页面默认按照模块
class
Meta中的
ordering所指的列排序。但目前没有指定
ordering值,所以当前排序是没有定义的。
class BookAdmin(admin.ModelAdmin):
... ...
ordering = ('-publication_date',)
|
- 自定义编辑表单:默认地,表单中的字段顺序是与模块中定义是一致的。
我们可以通过使用ModelAdmin子类中的fields选项来改变它:
class BookAdmin(admin.ModelAdmin):
... ...
fields = ('title', 'authors', 'publisher')
|
通过fields这个选项,你可以排除一些不想被其他人编辑的fields 只要不选上不想被编辑的
field(s)即可。当一个用户用这个不包含完整信息的表单添加一本新书时,Django会简单地将
publication_date设置为
None,以确保这个字段满足
null=True的条件。
另一个常用的编辑页面自定义是针对多对多字段的,使用
filter_horizontal,odelAdmin类还支持
filter_vertical选项。它像
filter_horizontal那样工作,除了控件都是垂直排列,不是水平排列的:
class BookAdmin(admin.ModelAdmin):
... ...
filter_horizontal = ('authors',)
|
filter_horizontal和
filter_vertical选项只能用在
多对多字段 上, 而不能用于
ForeignKey字段。解决这个问题的办法是使用“raw_id_fields”选项。它是一个包含外键字段名称的元组,它包含的字段将被展现成“文本框”,而不再是“下拉框”:
class BookAdmin(admin.ModelAdmin):
... ...
raw_id_fields = ('publisher',)
|
阅读(2666) | 评论(0) | 转发(0) |