首页 > 其他 > 详细

Xadmin组件

时间:2020-05-11 22:05:41      阅读:40      评论:0      收藏:0      [点我收藏+]

搭建一个类似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个表

 

Xadmin组件

原文:https://www.cnblogs.com/zh-xiaoyuan/p/12872010.html

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