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