一、django.contrib包
django.contrib是一套庞大的功能集。django自带许多功能插件,他们都存在于contrib包里。
二、激活管理界面
1、修改setting.py 文件:
1)将django.contrib.admin 加入setting的INSTALLED-APPS中
2)保证INSTALLED_APPS中包含'django.contrib.auth','django.contrib.contenttypes'和'django.contrib.sessions'
3)保证MIDDLEWARE_CLASSES包含'django.middleware.common.CommonMiddleware' 、'django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.auth.middleware.AuthenticationMiddleware' 。
2、运行python manage.py syncdb. 这一步将生成管理界面使用的额外数据库表。 当你把'django.contrib.auth'加进INSTALLED_APPS后,第一次运行syncdb命令时, 系统会请你创建一个超级用户。 如果你不这么做,你需要运行python manage.py createsuperuser来另外创建一个admin的用户帐号,否则你将不能登入admin (提醒一句: 只有当INSTALLED_APPS包含'django.contrib.auth'时,python manage.py createsuperuser这个命令才可用.)
3、修改urls.py 将admin访问配置在urls.py中。确保在urls.py 中存在以下内容:
# Include these import statements... from django.contrib import admin admin.autodiscover() # And include this URLpattern... urlpatterns = patterns('', # ... (r'^admin/', include(admin.site.urls)), # ... )好了,现在可以运行admin配置了。在浏览器输入: http://127.0.0.1:8000/admin/
三、使用管理工具
修改语言:
在setting.py 文件中的MIDDLEWARE_CLASSES中添加:‘django.middleware.locale.LocaleMiddleware’,并确保它在’django.contrib.sessions.middleware.SessionMiddleware’之后.
四、将Models添加到管理界面
在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)退出admin重新登录,发现包含一个Books区域,包含Publisher、Author、Book。
在默认情况下,admin管理界面中表单的每个属性都必须填写,如果想实现某些字段是可选的,需要修改models.py 文件。例如我们修改Author的email字段为可选的,在email字段添加blank = True.重新登录admin后发现email已经不是粗体了,这时候可以不填写email也能保存了。
在设置日期型和数字型字段可选的时候,需要 同时修改为:blank = True, null = True 。添加null=True比添加blank=True复杂。因为null=True改变了数据的语义,即改变了CREATE TABLE语句,Django不会尝试自动更新数据库结构。所以你必须执行ALTER TABLE语句将模块的改动更新至数据库。
六、自定义字段标签
在admin界面看到的字段的名字都是从models.py文件中你定义的字段名演变过来的:下划线用空格代替;字段首字母大写。如果你想自己定义字段在admin中的显示内容,只需在模块定义中指定verbose_name:
class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField(blank = True, verbose_name = 'e-mail')这时在admin管理界面中看到的email名称为:E-mail。你不用手动将verbose_name指定的值首字母大写,因为django会自动将其大写。
为了语法简洁,可以把它当做固定位置的参数传递:
class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField( 'e-mail', blank = True)默认的第一个参数就是这个字段在admin管理界面中显示的名称,但是对于ManyToManyField 和ForeignKey字段这种方式不适合,因为他们的第一个参数必须是模块类,这样就必须显式指定verbose_name的值。
七、自定义ModelAdmin类
上述的改变都是在模式级别而不是管理级别的,下面我们针对特别的模块自定义管理工具。
1、自定义列表
Author显示的列名是你在model定义中通过def__unicode__(self)函数指定的列名。
def __unicode__(self): return u'%s %s' % (self.first_name, self.last_name)我们可以在这个基础上添加其他的显示字段,为了实现这个目的,我们为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)注意:class一定要顶格写!
这样admin管理界面将会显示first_name、last_name、email三列信息.
新建一个类AuthorAdmin,它是从django.contrib.admin.ModelAdmin派生出来的子类,它保存着一个类的自定义配置。在这里它之定义了一个list_display,是一个字段名称的元组,用于列表显示。然后修改admin.site.register调用。
同理修改Publisher:
class PublisherAdmin(admin.ModelAdmin): list_display = ('name', 'address', 'city', 'country', 'website') admin.site.register(Publisher, PublisherAdmin)修改Book:
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') admin.site.register(Book, BookAdmin)注意,在Book中不能使用authors字段,因为它是一对多的关系。如果使用了authors字段会报错:
2、添加快速查询栏和过滤器
class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'email') search_fields = ('first_name', 'last_name') class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',)为Author添加快速查询栏,按照first_name和last_name查询,并且大小写不敏感。
按照publication_date进行过滤,它位于列表页面的右边。 Django为日期型字段提供了快捷过滤方式,它包含:今天、过往七天、当月和今年。
过滤器还适用于其他类型,不单单是日期类型,当有两个值以上时就会显示过滤器。如我按照Publisher进行过滤:
另外一种过滤日期的方式是,使用date_hierarchy = 'publisher_date'
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') date_hierarchy = 'publication_date'此时会在列表顶端有个逐层深入的导航条,从可用年份开始直至日。
请注意,date_hierarchy接受的是字符串,而不是元组。因为只能对一个日期型字段进行层次划分。
4、修改默认排序
默认排序是按照
class Meta: ordering = ['name']中定义的排序规则。下面修改Book的默认排序由title改为publication_date
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') date_hierarchy = 'publication_date' ordering = ('publication_date',)此时打开Books,会发现在title右侧有个小三角符号,表明现在是按照publication_date进行排序。
八、自定义编辑表单
1、以Book为例,默认的编辑表单页面如下:
我们可以改变字段的显示顺序,以及哪些字段能显示,哪些不会显示。例如,我们不想让用户编辑出版日期,就可以不让这个字段显示出来。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') date_hierarchy = 'publication_date' ordering = ('publication_date',) fields = ('title', 'authors', 'publisher')此时的编辑界面为:
当一个用户用这个不包含完整信息的表单添加一本新书时,Django会简单地将publication_date设置为None,以确保这个字段满足null=True的条件。
2、修改多对多选框
默认的多对多选框为:
需要按住Ctrl,如果项目比较多,会非常不方便,现在提供一种新的方式:filter_horizontal = ('authors',)
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') date_hierarchy = 'publication_date' ordering = ('publication_date',) fields = ('title', 'authors', 'publisher') filter_horizontal = ('authors',)
这种多选的方式比较方便。还可以设置filter_vertical = ('authors',),它是按照竖排排列
filter_horizontal、filter_vertical都只能用在多对多的字段上。对于外键,可以使用raw_id_fields
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') date_hierarchy = 'publication_date' ordering = ('publication_date',) fields = ('title', 'authors', 'publisher') filter_horizontal = ('authors',) raw_id_fields = ('publisher',)
在这个输入框中,你输入什么呢? publisher的数据库ID号。 考虑到人们通常不会记住这些数据库ID,管理工具提供了一个放大镜图标方便你输入。点击那个图标将会弹出一个窗口,在那里你可以选择想要添加的publishe。
九、权限的管理
可以对一些用户 的使用权限进行设置。
本文为Eliot原创,转载请注明出处:http://blog.csdn.net/xyw_eliot/article/details/8951808