注明
本笔记主要参考《Django应用开发实战》《Django企业开发实战》,这两本书前者详细,后者精炼。学习之后真的是感觉自己进步了很多。值得一读,如果你遇到了值得一读的书籍,欢迎推荐给我,大家共同进步
文章目录
前言
Admin后台系统也称为网站后台管理系统,主要对网站的信息进行管理。它是对网站数据库和文件进行快速操作和管理的系统,以使网页内容能够及时得到更新
一、初识Admin
Django的后台系统是默认开启的,若不需要admin后台系统可以在settings中注释配置(关闭admin可以减少程序对系统资源的占用。)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'index.apps.IndexConfig',
'user.apps.UserConfig',#user
'article.apps.ArticleConfig',
'classroom'
]
其中django.contrib.admin就代表admin后台系统。
进入admin系统
urlpatterns = [
path('admin/', admin.site.urls),]
创建超级用户来登录admin
在项目根目录输入命令
python manage.py createsuperuser
注:如果你已修改auth系统自带的user,每个字段一定要设置默认值或可以为空。否则无法通过上面命令创建超级用户。
将后台内容以中文显示
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
#使用中文
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
注:一定要注意顺序。中间件MIDDLEWARE 的写法将会在后文详细介绍。
admin网页布局
介绍:
- 站点管理:整个admin后台的主体页面,整个项目的App所定义的模型都会在此页面显示。
- 认证授权:Django内置的用户认证系统,包括用户信息、权限管理和用户组设置等功能。
- 用户和组:是认证和授权所定义的模型,分别对应auth_user和auth_user_groups. [我这里没有用户,是因为我修改了auth的user]
将自定义模型展示在admin页面中(即注册)
注册方法一:
admin.site.register(model,[继承ModelAdmin 的类])
参数解释:
model:所需要在admin页面展示的model名称。
ModelAdmin:用于设置模型如何展示在Admin后台系统里,具体写法后文将会介绍。
注册方法二:装饰器
使用装饰器admin.register(model)装饰继承ModelAdmin的类。
示例:
class MyUserAdmin(admin.ModelAdmin):
pass
@admin.register(ClassRoom)
class ClassRoom(admin.ModelAdmin):
pass
admin.site.register(MyUser,MyUserAdmin)
Modeladmin常用属性(字段)
fields:在变更模型时,设置的可编辑字段。格式为列表,默认为除exclude包含的字段
exclude:隐藏字段,使得字段不可编辑。
fieldsets:改变新增和修改页面的网页布局,不能与fields、exclude共用。其格式如下:所示
class ClassRoom(admin.ModelAdmin):
fieldsets = (
('班级介绍',{
'fields':('name','max_student','introduce')}),
('已有人员',{
#显示字段
'fields':('student_number',),
#隐藏字段
'classes':('create')
})
)
补充:字典中还可以用’description’添加’描述’,
注:
ClassRoom(models.Model):
name=models.CharField(max_length=200,verbose_name='班级名称')
max_student=models.PositiveIntegerField('班级容纳最大人数')
create=models.DateField(auto_now_add=True,verbose_name='创建时间')
student_number=models.SmallIntegerField('班级现有人数',default=0)
introduce=models.TextField('简要介绍',default='这个班级很神秘,没有什么简介')
结果:
radio_fields:将字段(外键字段或有choices参数)的下拉框展示,改为单选按钮。格式{
字段:value},value可选admin.HORIZONTAL水平排列,admin.VERTICAL。
readonly_fields:可读,但不可编辑字段列表形式。
ordering:以某些字段排序,格式为列表,元素添加-为降序。
sorted_by:设置数据列表页设置的每列数据是否可排序显示。列表形式
sortable_by = ['name','create']
list_display:格式为列表或元组,在数据列表页设置显示在页面的模型字段。
list_display = ['name','max_student','student_number','create']
结果
list_display_link:为模型字段设置路由,由该路由地址进入修改页面。
list_filter:格式为列表或元组,在数据列表页的右侧添加过滤器,用于筛选和查找数据。
list_filter = ['name','max_student']
结果
补充:自定义list_filiter一般通过继承admin的SimpleListFilter类,并重写两个属性(title标题、parameter_name查询URL的参数名,如查询分类id为1的内容,URL后面的Query部分是?parameter_name=1)和两个方法(lookups返回所需要查询的数据,queryset根据URL Query的内容返回列表页数据)
class CategoryOwnerFilter(admin.SimpleListFilter):
title = '分类过滤器'
parameter_name = 'owner_category'
def lookups(self, request, model_admin):
return Category.objects.filter(owner=request.user).values_list('id',
'name')
def queryset(self, request, queryset):
category_id=self.value()#如果?parameter_name=1那么self.value就是1
if category_id:
return queryset.filter(category_id=category_id)
return queryset
重写完之后,直接添加到list_filiter中。
list_filter = [CategoryOwnerFilter]
list_per_page:数据列表页每页的数据量
search_fields:设置搜索字段,说明:对于关联字段(外键)需要__
search_fields = ['title','category__name']
#------------models
category=models.ForeignKey(Category,verbose_name='分类',on_delete=models.CASCADE)
class Category(models.Model):
name=models.CharField(max_length=50,verbose_name='名称')
补充:__这种用法还可以作用于list_display和list_filter
save_as是否添加另存为的功能按钮
actions_on_bottom、actions_on_top:布尔值,设置动作栏的位置。
Modeladmin的方法(admin的二次开发)
通过上面的学习我们已经可以配置出完善的admin了,但还有很多问题没有解决:如页面展示不够友好,最好的解决方法,就是把自己当成用户去体验流程,在体验流程时,一定要将自己当作一般人,我们做出来的东西别人看到的永远是界面,而不是代码,这里不能简简单单的用代码足够优雅,框架合理就可以解决,更应该做出优雅对一般人友好的产品。下面将进一步进行定制admin。介绍Modelsadmin的方法,并实施重写,以达到二次开发的目的。
get_only_fields()函数
它获取readonly_fields的属性值,从而将模型字段设为只读,通过重写此方法可以自定义模型字段的只读属性,比如根据不同的用户角色来设置模型字段的只读属性。
@admin.register(ClassRoom)
class ClassRoom(admin.ModelAdmin):
fieldsets = (
('班级介绍',{
'fields':('name','max_student','introduce')}),
('已有人员',{
#显示字段
'fields':('student_number',),
#隐藏字段
'classes':('create')
})
)
ordering = ['-max_student']
sortable_by = ['name','create']
list_display = ['name','max_student','student_number','create']
list_display_link=['max_student']
list_filter = ['name','max_student']
list_per_page = 20
save_as = True
actions_on_bottom = True
actions_on_top = False
def get_readonly_fields(self, request, obj=None):
if request.user.profession=='superuser':
self.readonly_fields=[]
elif request.user.profession=='teacher':
self.readonly_fields=['student_number']
else:
self.readonly_fields=['name','max_student','introduce',&#