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组件之注册【模仿Django的admin】详解编程语言

二、然后在看下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") 

  

stark组件之注册【模仿Django的admin】详解编程语言

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

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

stark组件之注册【模仿Django的admin】详解编程语言

然后我们看下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) 

  

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

stark组件之注册【模仿Django的admin】详解编程语言

然后定义一个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) 

  

stark组件之注册【模仿Django的admin】详解编程语言

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

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函数中在实例化这个配置类

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20779.html

(0)
上一篇 2021年7月19日 23:44
下一篇 2021年7月19日 23:44

相关推荐

发表回复

登录后才能评论