django admin是django自带的一个后台app,提供了后台的管理功能
基础知识点:
一、认识ModelAdmin
管理界面的定制类,如需扩展特定的model界面需要从该类继承
默认情况下出版商显示界面如下:
仅仅显示出版商的名字,而出版商的其他信息,比如城市、省份、国家、网址这些都没有显示,如果要显示后面这些,我们可以进行如下操作:
在admin.py中定义一个出版社的管理类PublisherAdmin,然后继承admin.ModelAdmin类,实现代码如下:
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','country','state_province','city',)
解析:这个代码的意思除了定义出版社管理类并继承admin.ModelAdmin,通过admin.ModelAdmin的list_display属性值定义要显示的部分(name、country、state_province、city),这样就完成的了要显示字段的设置。刷新页面。
发现页面没有出现我们预期的定义效果,为什么呢?
仔细看下该代码:
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','country','state_province','city',)
发现这里仅仅是定义了类,而没有做任何注册操作。不把定义model类PublisherAdmin注册到django原生中admin类中是不能显示的,那怎么办呢?
二、注册model类到admin的两种方式:
1、使用register的方法(这里用出版商Publisher的类为例)
from django.contrib import admin
from hello.models import *
# Register your models here.
#定义一个出版商管理类PublisherAdmin,然后继承admin.ModelAdmin,最后将定义的出版商管理类注册到admin.site.register中
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','country','state_province','city',)
admin.site.register(Author)
admin.site.register(AuthorDetail)
admin.site.register(Book)
admin.site.register(Publisher,PublisherAdmin)
刷新页面出现如下界面:
当然显示字段是以英文出现的,这里我们可以去models.py中修改,具体通过修改属性字段verbose_name的值来操作,默认是英文,修改如下:
class Publisher(models.Model):
name = models.CharField(max_length=30, verbose_name="名称")
address = models.CharField("地址", max_length=50)
city = models.CharField("城市",max_length=60)
state_province = models.CharField("省份",max_length=30)
country = models.CharField("国家",max_length=50)
website = models.URLField("网址",)
2、使用register的装饰器
通过装饰器将定义的出版商类Publisher注册到admin.register中,同时注释掉#admin.site.register(Publisher,PublisherAdmin)
from django.contrib import admin
from hello.models import *
# Register your models here.
@admin.register(Publisher)
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','country','state_province','city',)
admin.site.register(Author)
admin.site.register(AuthorDetail)
admin.site.register(Book)
#admin.site.register(Publisher,PublisherAdmin)
方法1和2效果一样,但是方法2相对简单一点
三、掌握一些常用的设置技巧
list_display:指定要显示的字段
search_fields:指定搜索的字段
list_filter:指定列表过滤器
ordering:指定排序字段
from django.contrib import admin
from hello.models import *
# Register your models here.
@admin.register(Publisher)
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','country','state_province','city',)
search_fields = ('name',)
list_filter= ('city',)
ordering=('id')
admin.site.register(AuthorDetail)
admin.site.register(Book)
显示如下:
fieldsexclude:指定编辑表单需要编辑不需要编辑的字段
默认的是把所有的表单信息都可以进行编辑,如下所示:
如果对编辑的菜单做限制,比如值能编辑name和address字段,可以进行这样设置:
from django.contrib import admin
from hello.models import *
# Register your models here.
@admin.register(Publisher)
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','country','state_province','city',)
search_fields = ('name',)
list_filter= ('city',)
fields = ('name','address')
刷新页面效果就如下所示
如果对不编辑的菜单做限制,可以用exclude,这里把fields注释,用exclude来设置,出现效果刚好相反
from django.contrib import admin
from hello.models import *
# Register your models here.
@admin.register(Publisher)
class PublisherAdmin(admin.ModelAdmin):
list_display = ('name','country','state_province','city',)
search_fields = ('name',)
list_filter= ('city',)
#fields = ('name','address')
exclude = ('name','address',)
fieldsets:设置分组表单
更多高级使用的功能将在《Django进阶》课程里介绍,另外,值得注意的是,django admin更适合开发人员来使用,最终用户来使用的话用户体验还不是很好
https://docs.djangoproject.com/en/1.9/ref/contrib/admin