先回顾admin的启动流程:
Django一启动,Xadmin的site对象最终是要设计出注册model的增删改查四个url。
/app01/book/
/app01/book/add
/app01/book/id/delete
/app01/book/id/change
等于是urls.py中, url(r‘^Xadmin/‘, site.urls)一行就要返回所有的model增删改查等页面
使用流程基本上都是仿照admin
既然是一个app就需要在配置文件里安装一下
INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘Xadmin.apps.XadminConfig‘, # 加载Xadmin下的apps.py里的XadminConfig类 ‘app01.apps.App01Config‘, ‘app02.apps.App02Config‘, ]
XadminConfig自动发现所有叫Xadmin的模块并加载
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‘) # 自动发现并加载应用下所有Xadmin的模板
仿照admin为Xadmin写一个注册的类 Xadmin/service/Xadmin.py 位置随便写哪都行
admin使用思路回顾:
from django.conf.urls import url from django.shortcuts import render, HttpResponse, redirect # Xadmin流程回顾:1启动 2注册 3设计urls ! admin是为model服务的,所以注册的是model,设计的也是model的增删改查urls # 一个py文件可以同时完成注册、设计urls class ModelXadmin(object): def __init__(self, model, site): self.model = model self.site = site @property def urls2(self): return self.get_urls2(), None, None 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 def list_view(self, request): all_obj = self.model.objects.all() return render(request, ‘list_view.html‘, {‘all_obj‘: all_obj}) 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‘) class XadminSite(): def __init__(self): self._register = {} # ②注册model的函数,传入model和model的自定义类 def register(self, model, admin_class=None, **options): if not admin_class: admin_class = ModelXadmin # ③key是model,设计url的时候取app名字和类名 # values是样式对象,设计二级url,哪个model就设计哪个model的增删改查,然后就好取值了 self._register[model] = admin_class(model, self) # ④ 开始设计model的增删改查url(r‘^Xadmin/‘, site.urls) @property def urls(self): return self.get_urls(), None, None # ⑤ 第一次url分发,它是什么样的? /app01/book/ /app02/order/ def get_urls(self): temp = [] # 肯定返回列表 # ⑥ 循环self._register, key是model,value是样式对象 for model, admin_class_obj in self._register.items(): app_name = model._meta.app_label model_name = model._meta.model_name # ⑦ 第二次url分发 temp.append(url(r‘^{0}/{1}/‘.format(app_name, model_name), admin_class_obj.urls2)) return temp # ①单例模式对象,所有app的model都使用这个对象注册 site = XadminSite()
from Xadmin.service.Xadmin import site urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^Xadmin/‘, site.urls), ]
原文:https://www.cnblogs.com/lxfpy/p/10945587.html