• 模拟admin组件自己开发stark组件之创建篇


    admin组件

    admin组件为我们提供了针对django管理页面

    我们先简短来看下django的admin组件的启动流程,注册流程,url匹配过程

    启动注册

    1. 扫描所有应用下的注册了应用中的admin.py文件(启动,即扫描)

    from django.contrib.admin.sites import site
    from django.utils.module_loading import autodiscover_modules
    def autodiscover():
        autodiscover_modules('admin', register_to=site)    

    2. admin.site,这个文件是通过模块的导入然后调用类方法实现,并不是admin提供的方法(注册)

    sites.py文件
    site = AdminSite() 
    AdminSite类,包含了admin的全局配置
    注意###
    在admin.py里面,只有一个site对象,单例模式,以后的admin的应用都要基于 admin.site对象,也就是register也都是一个对象方法,
    admin.site.register(book1)
    admin.site.register(book2)
    admin.site.register(book3)
    
    admin.site都是一个实例

    3. admin.site.register,注册了model对象,样式类对象

    2个参数,第一个models,第二个可以不传,默认为空,样式类
    def register(self, model_or_iterable, admin_class=None, **options):
       if not admin_class:
                admin_class = ModelAdmin
            如果是None就会走默认的ModelAdmin样式
    
                如果不是None在admin里面继承了ModelAdmin样式,还在它的样式上有了自己的修改,也就是我们在admin.py里面自己的样式类
    
    有段源码,最后的名字就是 model_or_iterable = model
    
    self._registry[model] = admin_class(model, self)
    
    执行了就是在给类属性,添加键值对
    booke:(book配合Modeladmin是实例出来的对)象】
    
    如果再有注册,就是往后面追加键值对。model为键,样式为值        

    URL配置

    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    ]

    1. admin.site,还是上面的实例,也就是说所有的amdin.site都是一个实例,我们来看看里面的方法

    @property
    def urls(self):
        return self.get_urls(), 'admin', self.name   # 第一个参数是url列表,第二个是应用名称,第三个是命名空间
     def get_urls(self):
          urlpatterns = [
                url(r'^$', wrap(self.index), name='index'),]
          return urlpatterns

    最终会返回一个([url(),url(),url()],admin,self.name)这样的元祖

    2. 我们会这样想,一个项目下的一个应用下的一个表的增删改查,在这之前,我们先要拼接上app01/stark/book/(add,del,edit),我们来演演变过程

    urls演变过程
    url(r'^joker/', joker.site.urls),
    # @property
    # def urls(self):
    #     return self.get_urls(), 'stark', None
    #self.get_urls() == admin.site.get_urls()
    url(r'^joker/', ([url('','')], 'stark', None)),

    我们希望可以拼接应用名称,表名称

     def get_urls(self):
            urlpatterns = []
            for model, joker_admin in self._registry.items():   # 注册了就会得到2个对象,一个MODELS对象,一个样式类对象
                model_name = model._meta.model_name             # 应用名称
                app_label = model._meta.app_label               # 表名
                # UR()方法,里面第一个参数是正则,第二个是可调用对象,或者列表,元祖。
                # 如果是列表,元祖的话,
                c_url = url('^{0}/{1}/'.format(app_label,model_name),增删改查)  ## JOKER/APP01/BOOK,    分发
                                                                    # [url("^$",self.change_list),
                                                                    # url("^add/$",self.add),
                                                                    # url("^d+/change/$",self.change),
                                                                    # url("^d+/delete/$",self.delete),],NONE,NONE
    
                urlpatterns.append(c_url)
            return urlpatterns
    
        @property
        def urls(self):                                 # 模拟了ADMIN的URLS方法,看返回的是什么(【】,NONE, NONE)
            return self.get_urls(), None, None

    我们希望增删改查是每一个表都有的,我们将这个加入到默认样式类中,这个就很简单了,下面奉上创建stark的过程和代码

    stark创建

    1. 创建stark目录,里面在创建server目录,里面创建stark.py文件,作为我们的服务目录

    问题来了,谁来加载我们自己创建的目录呢,我们可以在stark应用下的apps.py中

    from django.apps import AppConfig
    
    from django.contrib.admin.sites import site
    from django.utils.module_loading import autodiscover_modules
    
    class starkConfig(AppConfig):          
        name = 'stark'
        # 启动发现
        def ready(self):    该类是默认就存在的,我们在下面加入准备方法,扫描所有应用下的stark.py文件
            autodiscover_modules('stark', register_to=site)

    2. 开始注册,在stark.py中写入

    # print("app01 stark....")  # 启动时候就会打印
    
    from stark.server import stark
    from .models import *
    
    stark.site.register(Book)   加载执行
    stark.site.register(Publish)

    3. 服务端的stark.py的配置,注意里面的url方法

    from django.conf.urls import url
    from django.shortcuts import HttpResponse
    
    # 首先是启动问题 settingS 注册,apps可以查询到
    
    class ModelAdmin(object):                            # 默认样式
        def __init__(self,model,site):
            self.model = model
            self.site = site
    
        def get_urls(self):                              # 默认的增删改查
    
            temp=[
                url("^$",self.change_list),
                url("^add/$",self.add),
                url("^d+/change/$",self.change),
                url("^d+/delete/$",self.delete),
            ]
    
            return temp
    
        @property                                  # 获取URL
        def urls(self):
            return self.get_urls(), None, None     #  URL 就是 三个参数,(【】,,)
    
        def change_list(self,request):
            return HttpResponse("change_list")
    
        def delete(self,request):
            return HttpResponse("delete")
    
        def change(self,request):
            return HttpResponse("change")
    
        def add(self,request):
            return HttpResponse("add")
    
    
    class Jokersite(object):                     # 针对JOKER的全局配置
        def __init__(self):
            self._registry = {}
        def register(self, model, joker_class=None):
            if not joker_class:
                joker_class = ModelAdmin
            self._registry[model] = joker_class(model, self)   # 添加类对象,MODEL对象:样式类对象
            print(self._registry)
    
        def get_urls(self):
    
            urlpatterns = []
            for model, joker_admin in self._registry.items():   # 注册了就会得到2个对象,一个MODELS对象,一个样式类对象
                model_name = model._meta.model_name             # 应用名称
                app_label = model._meta.app_label               # 表名
                # UR()方法,里面第一个参数是正则,第二个是可调用对象,或者列表,元祖。
                # 如果是列表,元祖的话,
                c_url = url('^{0}/{1}/'.format(app_label,model_name),joker_admin.urls)  ## stark/APP01/BOOK,    分发
                                                                    # [url("^$",self.change_list),
                                                                    # url("^add/$",self.add),
                                                                    # url("^d+/change/$",self.change),
                                                                    # url("^d+/delete/$",self.delete),],NONE,NONE
    
                urlpatterns.append(c_url)
            return urlpatterns
    
        @property
        def urls(self):                                 # 模拟了ADMIN的URLS方法,看返回的是什么(【】,NONE, NONE)
            return self.get_urls(), None, None
    
    site=Jokersite()    #  实例自己写的类
  • 相关阅读:
    cmd 一键获取 所有连接过的wifi 密码
    MYSQL注入语句
    Web安全篇之SQL注入攻击
    Kali Linux 不能联网上网 解决方法
    php杂项
    laravel下的数据序列化
    填充数据
    css
    array
    GD库常用函数
  • 原文地址:https://www.cnblogs.com/jokerbj/p/8385489.html
Copyright © 2020-2023  润新知