Django 之 Xadmin
先回顾 admin 的启动流程:
启动: 加载 admin 组件, 配置 urls 使网页可以访问到
注册: admin.site.register(model), 注册以后就可以增删改查这个表了
设计: 为每一个表设计增删改查 url
设计思想
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
1. 加载组件
既然是一个 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',
- ]
2. 自动发现
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 的模板
3. 注册的类
仿照 admin 为 Xadmin 写一个注册的类 Xadmin/service/Xadmin.py 位置随便写哪都行
admin 使用思路回顾:
启动 Xadmin(已完成)
注册 model(写一个注册的类)
为注册的 model 设计增删改查四个 urls.(写一个设计 urls 的类)
- 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 = {}
- # 2注册 model 的函数, 传入 model 和 model 的自定义类
- def register(self, model, admin_class=None, **options):
- if not admin_class:
- admin_class = ModelXadmin
- # 3key 是 model, 设计 url 的时候取 App 名字和类名
- # values 是样式对象, 设计二级 url, 哪个 model 就设计哪个 model 的增删改查, 然后就好取值了
- self._register[model] = admin_class(model, self)
- # 4 开始设计 model 的增删改查 url(r'^Xadmin/', site.urls)
- @property
- def urls(self):
- return self.get_urls(), None, None
- # 5 第一次 url 分发, 它是什么样的? /app01/book/ /app02/order/
- def get_urls(self):
- temp = [] # 肯定返回列表
- # 6 循环 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
- # 7 第二次 url 分发
- temp.append(url(r'^{0}/{1}/'.format(app_name, model_name), admin_class_obj.urls2))
- return temp
- # 1单例模式对象, 所有 App 的 model 都使用这个对象注册
- site = XadminSite()
4. 激活组件
- from Xadmin.service.Xadmin import site
- urlpatterns = [
- url(r'^admin/', admin.site.urls),
- url(r'^Xadmin/', site.urls),
- ]
来源: http://www.bubuko.com/infodetail-3075867.html