• stark组件之注册【模仿Django的admin】


    一、先看下django的admin是如何实现注册功能

    首先导入admin这个对象和我们的model模块

    from django.contrib import admin
    
    # Register your models here.
    
    from app1 import models
    

      

    然后调用admin的register方法进行注册

    admin.site.register(models.book,testbook)
    admin.site.register(models.publist)
    admin.site.register(models.auther)
    

      

    我们看下页面的效果,这里我们就可以看到我们注册的表,然后就可以对表做各种增删改查的操作了

    二、然后在看下stark组件是如何实现注册功能的

    首先需要在我们的stark组件的apps文件定义一下,扫码所有的app的stark.py文件,并执行

    from django.apps import AppConfig
    from django.utils.module_loading import autodiscover_modules
    
    
    class StarkConfig(AppConfig):
        name = 'stark'
    
        def ready(self):
            # 扫描所有的stark.py文件,并执行
            autodiscover_modules("stark")
    

      

     下面我们开始进行注册的功能

    这里我们要用到一个单例对象,也就是所有的app只要通过stark组件进行注册,那么他们使用同一个单例对象

    然后我们看下Starksite类中的register方法

    class Starksite(object):
        def __init__(self):
            self._register = {}
    
        def register(self,model,stark_class=None):
            if not stark_class:
                stark_class = Starkclass
    
            self._register[model] = stark_class(model,self)
    

      

    先初始化一个空的字典的变量

    然后定义一个register方法

        def register(self,model,stark_class=None):
            if not stark_class:
                stark_class = Starkclass
    
            self._register[model] = stark_class(model,self)
    

      

    这里的model是就是我们要注册的表,这里stark_class就是我们要注册的表的对应的类,比如要显示哪些字段啊的配置信息,用户可以不传递这个配置类,我们为这个参数传递了一个默认参数为None,如果用户没有传递这个配置类,那么我们就用默认的配置类即可

    下面是我们默认的配置类,只要在客户自定义的类中有的参数,这里必须要来一份

    class Starkclass(object):
        list_display = ['__str__']
        list_display_links = []
        search_fields = []
        modelformclass = None
        actions = []
    

      

    下面我们看下注册的的方法

    from stark.services import stark
    from django.utils.safestring import mark_safe
    
    from app1 import models
    
    from django.forms import ModelForm
    from django import forms
    
    class mybookmodelform(forms.ModelForm):
        class Meta:
            model = models.book
            fields = '__all__'
            labels = {
                "title":"书籍名称",
                "price":"书籍价格"
            }
    
    
    class bookclass(stark.Starkclass):
    
        list_display = ["id","title","price","auther","publish"]
        list_display_links = ["id","price","auther"]
        search_fields = ["title","price"]
        def test_action(self,request,queryset):
            print(queryset,)
    
        actions = [test_action]
        # test_action.__name__ = "测试批量操作的函数"
        test_action.short_description = "测试批量操作的函数"
    
    
        modelformclass = mybookmodelform
    
        list_filter = ["title","auther", "publish",]
    
    stark.site.register(models.book,bookclass)
    
    stark.site.register(models.auther)
    
    stark.site.register(models.publist)
    
    
    stark.site.register(models.test)
    

      

    这里我们在看默认的配置类对象的__init__方法

    class Starkclass(object):
        list_display = ['__str__']
        list_display_links = []
        search_fields = []
        modelformclass = None
        actions = []
    
        list_filter = []
    
        def __init__(self,model,site):
            self.model = model
            self.site = site
    

      

    他需要3个参数

    参数1:这个类的实例对象

    参数2:表对应的对象实例

    参数3:单例对象

    然后我们在看下我们的注册的函数

        def register(self,model,stark_class=None):
            if not stark_class:
                stark_class = Starkclass
    
            self._register[model] = stark_class(model,self)
    

      

     然后在看下我们自定义配置类的是怎么定义的

    class bookclass(stark.Starkclass):
    
        list_display = ["id","title","price","auther","publish"]
        list_display_links = ["id","price","auther"]
        search_fields = ["title","price"]
        def test_action(self,request,queryset):
            print(queryset,)
    
        actions = [test_action]
        # test_action.__name__ = "测试批量操作的函数"
        test_action.short_description = "测试批量操作的函数"
    
    
        modelformclass = mybookmodelform
    
        list_filter = ["title","auther", "publish",]
    

      

    stark.site.register(models.book,bookclass)
    

      

        def register(self,model,stark_class=None):
            if not stark_class:
                stark_class = Starkclass
    
            self._register[model] = stark_class(model,self)
    

      

    这里传递一个表的对象,和这个表的配置类,切记,这里是传递了一个这个表的配置类,而不是对象,我们在register函数中在实例化这个配置类

  • 相关阅读:
    现在的代码,贴一下
    2014年七月写过的代码,现在看来,还有待改进呀
    第一次做技术论坛发博文,不知道说点啥
    04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用
    04-树5. File Transfer--并查集
    04-树4. Root of AVL Tree-平衡查找树AVL树的实现
    03-树3. Tree Traversals Again (25)将先序遍历和中序遍历转为后序遍历
    03-树2. List Leaves (25) 二叉树的层序遍历
    二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
    最大子序列和问题之算法优化
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/10134953.html
Copyright © 2020-2023  润新知