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()

浙公网安备 33010602011771号