三十、Kingadmin

Django提供了Admin来做后台管理
这里Kingadmin为自己做的后台管理

1、Kingadmin Base

from django.shortcuts import render

class BaseKingAdmin(object):
    list_display = []
    list_filter = []
    search_fields = []
    readonly_fields = []
    filter_horizontal = []
    list_per_page = 20
    default_actions = ['delete_selected_objs']
    actions = []

    def __init__(self):
        self.actions.extend(self.default_actions) # 这样子类定义了actions也有default_actions

    def delete_selected_objs(self,request,querysets):
        # 待完
        return render(request,'kingadmin/table_obj_delete.html')


class AdminSite(object):
    def __init__(self):
        self.enabled_admins = {}

    def register(self, app_class, admin_class=None):
        app_name = app_class._meta.app_label # 拿到传入的model所在的app名
        model_name = app_class._meta.model_name #拿到model的名字(小写)

        if not admin_class: # 将kingadmin类实例化
            admin_class = BaseKingAdmin()
        else:
            admin_class = admin_class()
        admin_class.model = app_class # 将model类赋值给kingadmin对象

        if app_name not in self.enabled_admins:
            self.enabled_admins[app_name] = {} #分app名保存字典{model小写名:kingadmin对象}
        self.enabled_admins[app_name][model_name] = admin_class

site = AdminSite() #实例一个全局的site

2、注册Kingadmin

app/kingadmin.py

from kingadmin.sites import site, BaseKingAdmin
from web import models

class CustomerAdmin(BaseKingAdmin):
    list_display = ['name','source','contact_type','contact','consultant','consult_content','status','date']
    list_filter = ['source','consultant','status','date']
    search_fields = ['contact','consultant__name']

    readonly_fields = ['status', 'contact']
    filter_horizontal = ['consult_courses', ]

    actions = ['change_status', ]

    def change_status(self, request, querysets):
        print("kingadmin action:", self, request, querysets)
        querysets.update(status=0)

site.register(models.CustomerInfo,CustomerAdmin)
site.register(models.Role)
site.register(models.Menus)
site.register(models.UserProfile)

3、主动发现注册了Kingadmin的model
kingadmin/app_setup.py

from django import conf

def kingadmin_auto_discover():
    for app_name in conf.settings.INSTALLED_APPS: # 遍历项目所有app名字
        try: # 主动导入app下名为kingadmin的模块。这样那些model就成功注册kingadmin
            mod = __import__('%s.kingadmin' % app_name) 
            # print(mod.kingadmin)
        except ImportError:
            pass

importlib与__import__

for app_name in conf.settings.INSTALLED_APPS:
    try:
        mod = importlib.import_module('.admin', app_name)
        print(mod)
    except ImportError:
        pass
    try:
        mod = __import__('%s.admin' % app_name)
        print(mod)
    except ImportError :
        pass

结果:
<module 'django.contrib.auth.admin' from 'C:\\Program Files\\Anaconda3\\envs\\my_env3.8\\lib\\site-packages\\django\\contrib\\auth\\admin.py'>
<module 'django' from 'C:\\Program Files\\Anaconda3\\envs\\my_env3.8\\lib\\site-packages\\django\\__init__.py'>
<module 'django.contrib.contenttypes.admin' from 'C:\\Program Files\\Anaconda3\\envs\\my_env3.8\\lib\\site-packages\\django\\contrib\\contenttypes\\admin.py'>
<module 'django' from 'C:\\Program Files\\Anaconda3\\envs\\my_env3.8\\lib\\site-packages\\django\\__init__.py'>
<module 'kingadmin.admin' from 'C:\\Users\\Administrator\\PycharmProjects\\my_env3\\CRM\\kingadmin\\admin.py'>
<module 'kingadmin' from 'C:\\Users\\Administrator\\PycharmProjects\\my_env3\\CRM\\kingadmin\\__init__.py'>


for app_name in conf.settings.INSTALLED_APPS:
    try:
        mod = importlib.import_module('.kingadmin', app_name)
        print(mod)
    except ImportError:
        pass
    try:
        mod = __import__('%s.kingadmin' % app_name)
        print(mod.kingadmin)
    except ImportError :
        pass

结果:
<module 'web.kingadmin' from 'C:\\Users\\Administrator\\PycharmProjects\\my_env3\\CRM\\web\\kingadmin.py'>
<module 'web.kingadmin' from 'C:\\Users\\Administrator\\PycharmProjects\\my_env3\\CRM\\web\\kingadmin.py'>

在views.py中加入

from kingadmin import app_setup
app_setup.kingadmin_auto_discover() # 主动加载一些模块

from kingadmin.sites import site # 带有model的kingadmin类 
from kingadmin import form_handle # 动态的model_form

{% for app_name,app_tables in site.enabled_admins.items %} 通过site里的字典就可以拿到app名和注册的model

posted @   Bruce_JRZ  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示