zoukankan      html  css  js  c++  java
  • Xadmin的实现

    一、启动

    1、前提

    配置setting.py文件 INSTALLED_APPS

    2、定位Xadmin,找到对应的类

    'Xadmin.apps.XadminConfig',

    3、根据admin源码,实现启动

    from django.apps import AppConfig
    from django.utils.module_loading import autodiscover_modules
    
    
    class XadminConfig(AppConfig):
        name = 'Xadmin'
    
        # 启动Xadmin
        def ready(self):
            autodiscover_modules('Xadmin')

    二、注册

    1、根据需求,需要自定义 注册的对象和方法

    根据admin源码

    # 定义ModelXadmin, models的样式
    class ModelXadmin:
    
        def __init__(self, model, site):
            self.model = model
            self.site = site
    
    
    # 定义 XadminSite类
    class XadminSite:
    
        def __init__(self, name='Xadmin'):
            self._registry = {}
    
        def register(self, model, admin_class=None, **options):
            if not admin_class:
                admin_class = ModelXadmin
            self._registry[model] = admin_class(model, self)
    
    
    site = XadminSite()

    2、注册

    from Xadmin.service.Xadmin import site
    from app01.models import Book, Publish, Author, AuthorDetail
    
    # Register your models here.
    
    site.register(Book)
    site.register(Publish)
    site.register(Author)
    site.register(AuthorDetail)

    三、设置url

    1、设置url

    from django.contrib import admin
    from Xadmin.service.Xadmin import site
    from django.urls import path
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('Xadmin/', site.urls),
    ]

    2、分发url

    from django.urls import path
    from django.shortcuts import HttpResponse
    
    # 定义ModelXadmin, models的样式
    class ModelXadmin:
    
        def __init__(self, model, site):
            self.model = model
            self.site = site
    
    
    # 定义 XadminSite类
    class XadminSite:
    
        def list_view(self, request):
            print(request.path)
            return HttpResponse("list_view")
    
        def add_view(self, request):
            print(request.path)
            return HttpResponse("add_view")
    
        def change_view(self, request, id):
            print(request.path)
            return HttpResponse("change_view")
    
        def delete_view(self, request, id):
            print(request.path)
            return HttpResponse("delete_view")
    
        def __init__(self, name='Xadmin'):
            self._registry = {}
    
        def register(self, model, admin_class=None, **options):
            if not admin_class:
                admin_class = ModelXadmin
            self._registry[model] = admin_class(model, self)
    
        # 一级urls
        def get_urls(self):
            temp = []
            for models, admin_class_obj in self._registry.items():
                app_name = models._meta.app_label
                models_name = models._meta.model_name
                temp.append(path('%s/%s/' % (app_name, models_name), self.urls2)),
            return temp
    
        # 二级urls
        def get_urls2(self):
            temp = []
            temp.append(path('', self.list_view))
            temp.append(path('add/', self.add_view))
            temp.append(path('<id>/change/', self.change_view))
            temp.append(path('<id>/delete/', self.delete_view))
            return temp
    
        @property
        def urls(self):
            return self.get_urls(), None, None
    
        @property
        def urls2(self):
            return self.get_urls2(), None, None
    
    
    site = XadminSite()

    3、将有关样式的分发迁移到样式类中

    from django.urls import path
    from django.shortcuts import HttpResponse, render
    
    
    # 定义ModelXadmin, models的样式
    class ModelXadmin:
    
        def __init__(self, model, site):
            self.model = model
            self.site = site
    
        def list_view(self, request):
            print(request.path)     # /Xadmin/app02/food/
            print(self.model)   # <class 'app02.models.Food'>
            data_list = self.model.objects.all()
            # return HttpResponse("list_view")
            return render(request, "show_food.html", {"data_list": data_list})
    
        def add_view(self, request):
            print(request.path)
            return HttpResponse("add_view")
    
        def change_view(self, request, id):
            print(request.path)
            return HttpResponse("change_view")
    
        def delete_view(self, request, id):
            print(request.path)
            return HttpResponse("delete_view")
    
        # 二级urls
        def get_urls(self):
            temp = []
            temp.append(path('', self.list_view))
            temp.append(path('add/', self.add_view))
            temp.append(path('<id>/change/', self.change_view))
            temp.append(path('<id>/delete/', self.delete_view))
            return temp
    
        @property
        def urls(self):
            return self.get_urls(), None, None
    
    
    # 定义 XadminSite类
    class XadminSite:
    
        def __init__(self, name='Xadmin'):
            self._registry = {}
    
        def register(self, model, admin_class=None, **options):
            if not admin_class:
                admin_class = ModelXadmin
            self._registry[model] = admin_class(model, self)
    
        # 一级urls
        def get_urls(self):
            temp = []
            # admin_class_obj 是 ModelXadmin的对象
            for models, admin_class_obj in self._registry.items():
                app_name = models._meta.app_label
                models_name = models._meta.model_name
                temp.append(path('%s/%s/' % (app_name, models_name), admin_class_obj.urls)),
            return temp
    
        @property
        def urls(self):
            return self.get_urls(), None, None
    
    
    site = XadminSite()

    优点

    1、每一个表对应不同的模板

    2、在样式类中方便调用表的数据

    self.models   # <class 'app02.models.Food'>         
    models.Food
  • 相关阅读:
    【程序2】
    【程序1】
    基数排序
    归并排序
    选择排序
    leetcode15
    leetcode221
    leetcode322
    leetcode921
    leetcode922
  • 原文地址:https://www.cnblogs.com/wt7018/p/11370940.html
Copyright © 2011-2022 走看看