首页 > 其他 > 详细

Xadmin

时间:2019-05-29 19:55:31      阅读:139      评论:0      收藏:0      [点我收藏+]

Django之Xadmin

先回顾admin的启动流程:

  1. 启动:加载admin组件,配置urls使网页可以访问到
  2. 注册:admin.site.register(model),注册以后就可以增删改查这个表了
  3. 设计:为每一个表设计增删改查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使用思路回顾:

  1. 启动Xadmin(已完成)
  2. 注册model(写一个注册的类)
  3. 为注册的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 = {}

    # ②注册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()

4. 激活组件

from Xadmin.service.Xadmin import site
urlpatterns = [
    url(r^admin/,  admin.site.urls),
    url(r^Xadmin/, site.urls),
]

 

Xadmin

原文:https://www.cnblogs.com/lxfpy/p/10945587.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!