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