对于一些项目,如果你想要一次性自动将所有的 Model 注册到 Admin 页面,可以参照以下方法。你不仅可以通过编写规则快速进行注册,而且可以自定义某些 Model。
from django.apps import apps
from django.conf import settings
from django.contrib import admin
from django.contrib.admin import ModelAdmin
from django.contrib.admin.sites import AlreadyRegistered
from django.contrib.auth.admin import UserAdmin
from django.db.models import AutoField, CharField, TextField, BooleanField, DateTimeField, DateField, EmailField, \
SmallIntegerField, PositiveSmallIntegerField, URLField, ForeignKey, ManyToManyField
from main.models import AdminUser
admin.site.site_title = '管理后台v3'
admin.site.site_header = '管理后台v3'
@admin.register(AdminUser)
class AdminUserAdmin(UserAdmin):
list_display = [
'pk', 'username', 'full_name', 'mobile', 'desc', 'is_staff', 'is_superuser', 'date_joined', 'last_login']
list_display_links = ['pk', 'username']
readonly_fields = ['date_joined', 'last_login']
search_fields = ['username', 'full_name', 'mobile', 'desc']
list_filter = ('is_staff', 'is_superuser', 'groups')
fieldsets = (
('基础信息', {'fields': ('username', 'password', 'mobile', 'full_name')}),
('个人信息', {'fields': ('roles', 'desc',)}),
('权限管理', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups')}),
('登录信息', {'fields': ('last_login', 'date_joined')}),
)
exclude_apps = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework'
]
app_models_list = list()
for app in settings.INSTALLED_APPS:
if app not in exclude_apps:
app_models = apps.get_app_config(app).get_models()
app_models_list.append(app_models)
# 需要显示的字段类型
list_display_types = [
AutoField, CharField, TextField, BooleanField, DateTimeField, DateField,
EmailField, SmallIntegerField, PositiveSmallIntegerField, URLField, ForeignKey]
search_fields_types = [CharField, TextField, EmailField]
# 可以用于筛选的字段类型
list_filter_types = [ForeignKey, ]
# 不显示的字段
exclude_field_names = ['id', 'password']
# 自动更新创建操作人员信息
class AutoUpdateUserModelAdmin(admin.ModelAdmin):
view_on_site = False
readonly_fields = ('created_by', 'updated_by')
date_hierarchy = 'datetime_created'
def save_model(self, request, instance, form, change):
user = request.user
instance = form.save(commit=False)
if not change or not instance.created_by:
instance.created_by = user
instance.updated_by = user
instance.save()
form.save_m2m()
return instance
# 将所有的 models 注册到 admin
for app_models in app_models_list:
for model in app_models: # 遍历所有的 models
try:
list_display = ['pk', '__str__']
list_filter = []
filter_horizontal = []
search_fields = []
auto_update_user = 0
admin_class = ModelAdmin
for f in getattr(model, '_meta').fields: # 遍历所有的字段,不包括 ManyToManyField
if type(f) in list_display_types: # 如果字段在需要显示的字段类型列表内
if f.name not in exclude_field_names: # 排除不需要显示的字段
list_display.append(f.name)
if type(f) in list_filter_types:
if f.name in list_display:
list_filter.append(f.name)
if type(f) in search_fields_types:
if f.name not in exclude_field_names:
search_fields.append(f.name)
if f.name in ['created_by', 'updated_by', 'datetime_created']:
auto_update_user += 1
for f in getattr(model, '_meta').many_to_many: # 遍历所有的 ManyToManyField
if f.name not in exclude_field_names:
filter_horizontal.append(f.name)
if auto_update_user == 3: # 如果符合条件,选用自动更新用户信息的ModelAdmin
admin_class = AutoUpdateUserModelAdmin
admin.site.register(
model,
admin_class=admin_class,
list_display=list_display, # 列表页面显示的字段
list_display_links=['pk', '__str__'], # 列表页面可跳转至详情页面的字段
list_filter=list_filter,
autocomplete_fields=list_filter,
search_fields=search_fields,
filter_horizontal=filter_horizontal
)
except AlreadyRegistered: # 避免重复注册报错
pass
利用 get_models 方法我们可以获取到所有的 Model。将获取到的 models 进行遍历,逐个进行注册。