搭建一个类似admin功能的Xadmin组件
‘Xadmin.apps.XadminConfig‘, ‘app01.apps.App01Config‘, ‘app02.apps.App02Config‘,
Xadmin实现流程:
(1) 启动:在Django执行的这一刻把每一个叫Xadmin.py文件都加载一遍
#Xadmin/service/apps.py from django.apps import AppConfig from django.utils.module_loading import autodiscover_modules class XadminConfig(AppConfig): name = ‘Xadmin‘ def ready(self): #当加载这个类的时候,这个方法自动执行 autodiscover_modules(‘Xadmin‘) #通过此步设置,Django一启动就是扫描每一个叫Xadmin.py的文件
(2) 注册与url的设计
Xadmin/serice/Xadmin.py
from django.conf.urls import url from django.shortcuts import HttpResponse,render,redirect #定义默认的样式类 class ModelXadmin(object): def __init__(self,model,site): self.model=model self.site=site #site为单例对象 def list_view(self, request): print("self.model",self.model) #用户访问的是哪张表,self.model就是哪张表,这就是urls跨类定义最大的意义所在 #这里首先要弄清楚self是什么,我们一层一层的找,self->list_view->get_urls2->urls2->admin_class_obj, #所以这里self.model就相当于admin_class_obj.mode,如果我们对Book进行注册的话会在site,_registry生成一个键值 #{Book:ModelXadmin(Book,site)},所以admin_class_obj=ModelXadmin(Book,site),而ModelXadmin(Book,site).Book=Book data_list=self.model.objects.all() print("data_list",data_list) return render(request, ‘list_view.html‘,{"data_list":data_list}) def add_view(self, request): return render(request, ‘add_view.html‘) def change_view(self, request, id): return render(request, ‘change_view.html‘) def delete_view(self, request, id): return render(request, ‘delete_view.html‘) def get_urls2(self): temp = [] temp.append(url(r"^$", self.list_view)) temp.append(url(r"^add/$", self.add_view)) temp.append(url(r"^(\d+)/change/$", self.change_view)) temp.append(url(r"^(\d+)/delete/$", self.delete_view)) return temp @property def urls2(self): #urls2跨类定义 return self.get_urls2(), None, None # 定义一个类,用对创建单例对象 class XadminSite(object): def __init__(self, name=‘admin‘): #self为单例对象site self._registry = {} def get_urls(self): print(self._registry) # {Book:ModelAdmin(Book),.......} temp = [] for model, admin_class_obj in self._registry.items(): # admin_class_obj是上面ModelXadmin类的实例化对象,把urls定义在ModelXadmin类中 app_name = model._meta.app_label model_name = model._meta.model_name temp.append(url(r‘^{0}/{1}/‘.format(app_name, model_name), admin_class_obj.urls2), ) ‘‘‘ url(r"app01/book",ModelXadmin(Book,site).urls2) url(r"app01/publish",ModelXadmin(Publish,site).urls2) url(r"app02/order",ModelXadmin(Order,site).urls2) ‘‘‘ return temp @property def urls(self): return self.get_urls(),None,None def register(self, model, admin_class=None, **options): if not admin_class: admin_class = ModelXadmin #使用默认的样式 self._registry[model] = admin_class(model, self) # {Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)} site=XadminSite() #创建单例对象
app01/Xadmin.py
print("app01 Xadmin") from Xadmin.service.Xadmin import site,ModelXadmin from app01.models import * #导入所有表进行注册 #定义我们自己的样式 class BookConfig(ModelXadmin): list_display=["title","prcie"] site.register(Book,BookConfig) #注册book表 class BookConfig(ModelXadmin): list_display=["name"]
site.register(Publish,BookConfig) site.register(Author) site.register(AuthorDetail)
app02/Xadmin.py
print("app02 Xadmin") from Xadmin.service.Xadmin import site from app02.models import * site.register(Order) site.register(Food) print("_registry",site._registry) #6个表
原文:https://www.cnblogs.com/zh-xiaoyuan/p/12872010.html