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

 

posted on 2018-12-18 06:51  bainianminguo  阅读(229)  评论(0编辑  收藏  举报