Django组件--admin
admin组件的使用
Django 提供了基于 web 的管理工具,为每一个app下的每一个model表进行增删改查。
Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中INSTALLED_APPS 看到它
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', "app01" ]
django.contrib是一套庞大的功能集,它是Django基本代码的组成部分。
激活管理工具
通常我们在生成项目时会在 urls.py 中自动设置好,
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
当这一切都配置好后,Django 管理工具就可以运行了。
使用管理工具
启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,得到登陆界面(需要进行数据库迁移,才能登陆和注册超级用户),你可以通过命令 python manage.py createsuperuser 来创建超级用户。
为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型到 admin
from app01 import models admin.site.register(models.UserInfo)
但是,这种方式比较简单,如果想要进行更多的定制操作,需要利用ModelAdmin进行操作,如:
# 方式一,重写样式类,默认样式类admin.ModelAdmin,可以通过继承来修改参数 from django.contrib import admin class A(admin.ModelAdmin): list_display=["id","name","email"] admin.site.register(UserInfo,A) # 第一个参数可以是模型类的列表 方式二: @admin.register(models.UserInfo) # 第一个参数可以是列表 class UserAdmin(admin.ModelAdmin): list_display = ('user', 'pwd',)
admin.ModelAdmin样式类中的一些参数
1 list_display,列表时,定制显示的列,现实的列不可以是多对多的值(多个值)。
class A(admin.ModelAdmin): list_display=["id","name","email"]
2 list_display_links,列表时,定制列可以点击跳转。
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] list_display_links = ('name',"email")
3. list_filter,列表时,定制右侧筛选框的内容。
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] list_filter=["roles"] # 将人以角色分组,右侧菜单显示全部组
4. list_select_related,列表时,连表查询是否自动select_related
5. list_editable,列表时,可以编辑的列(编辑的列不可以是跳转的列)
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] list_editable=['name'] # 可以直接在列表页修改和保存,不必进入详细页
6. search_fields,列表时,模糊搜索的功能
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] search_fields=["name","email"] # 提供模糊搜索的列,可以对这些列进行模糊搜索
7. date_hierarchy,列表时,对Date和DateTime类型进行搜索
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] date_hierarchy = 'time' # 传入一个时间字段名,列表左上角会有一个时间的归档
8 inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
class UserInfoInline(admin.StackedInline): # TabularInline extra = 0 model = models.UserInfo class GroupAdminMode(admin.ModelAdmin): list_display = ('id', 'title',) inlines = [UserInfoInline, ]
9 action,列表时,定制action中的操作
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] def foo(self, request, queryset): # queryset是选中元素的对象 pass foo.short_description = "中文显示自定义Actions" # 批量操作的名称 actions = [foo,] # 传递函数列表
# Action选项都是在页面上方显示 actions_on_top = True # Action选项都是在页面下方显示 actions_on_bottom = False # 是否显示选择个数 actions_selection_counter = True
10 定制HTML模板
add_form_template = None change_form_template = None change_list_template = None delete_confirmation_template = None delete_selected_confirmation_template = None object_history_template = None
11 raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式,而不再是select框
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] raw_id_fields = ('roles',)
12 fields,详细页面时,显示字段的字段
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] fields=["name"]
13 exclude,详细页面时,排除的字段
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] exclude=["name"]
14 readonly_fields,详细页面时,只读字段
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] readonly_fields=["name"]
15 fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] fieldsets = ( # 将内容分组 ('AAAA', { # 这个键是组名 'fields': ('name', 'email') # 这里的值是组中的字段 }), ('其他', { 'classes': ('collapse', 'wide', 'extrapretty'), # 设置样式类 'fields': ('roles',), }), )
16 详细页面时,M2M显示时,数据移动选择(方向:上下和左右)
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] date_hierarchy = 'time' filter_vertical = ("roles",) # 多对多时设置两个框,将要设置的内容移到框里 # 或者filter_horizontal = ("roles",)
17 ordering,列表时,数据排序规则
class UserInfoConfig(admin.ModelAdmin): list_display = ["id", "name", "email"] ordering = ('-id',) 或 def get_ordering(self, request): return ['-id', ]
18. radio_fields,详细页面时,使用radio显示选项(FK默认使用select)
radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
19 form = ModelForm,用于定制用户请求时候表单验证 --过
20 empty_value_display = "列数据为空时,显示默认值"
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): empty_value_display = "列数据为空时,默认显示" list_display = ('user','pwd','up') def up(self,obj): return obj.user up.empty_value_display = "指定列数据为空时,默认显示"
Admin源码解析
admin实现流程
一 注册
1 当django项目启动时,admin应用首先扫描(加载)每一个app下面的admin.py文件
2 (1)from django.contrib import admin
加载admin -->sites---->site = AdminSite() (单例对象)
(2)每一个admin.py中
admin.site.register(Book)
class AdminSite(): def __init__(self, name='admin'): self._registry = {} def register(self, model, admin_class=None,): # 注册的方法,接收一个模型类和一个样式类 if not admin_class: # 如果没有传递样式类就是用默认的样式类 admin_class = ModelAdmin self._registry[model] = admin_class(model, self) # 将数据存储在self._registry中,模型类为键,该模型的样式类实例为值
二 生成url
根据类名和项目名生成url,再分发功能.
根据模型类获取项目名和类名
models._meta.app_label # app名字 models._meta.model_name # 小写类名
django中部分代码
class AdminSite(object): def get_urls(self): from django.conf.urls import url, include from django.contrib.contenttypes import views as contenttype_views urlpatterns = [ # 关于登录的url ] valid_app_labels = [] for model, model_admin in self._registry.items(): # self._registry存储这已注册模型类与该类样式类的实例 urlpatterns += [ url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),分发给该样式类实例 ] return urlpatterns @property def urls(self): return self.get_urls(), 'admin', self.name
样式类中的urls
class ModelAdmin(BaseModelAdmin): def get_urls(self): from django.conf.urls import url info = self.model._meta.app_label, self.model._meta.model_name urlpatterns = [ url("正则",处理的函数,name), ... ] return urlpatterns @property def urls(self): return self.get_urls()