Django 快速注册所有 model 到 Admin

对于一些项目,如果你想要一次性自动将所有的 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 进行遍历,逐个进行注册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值