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

stark组件之注册【模仿Django的admin】的更多相关文章

  1. stark组件之路由分发【模仿Django的admin】

    一.先看下django的admin是如何进行路由分发的 1.先看下django的admin的url路径有哪些 其实很简单,假如有一个书籍表,那么每张表对应四个url,增.删.改.查 查看的url ht ...

  2. stark组件之启动【模仿Django的admin】

    首先需要在settings注册app INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib ...

  3. stark组件之pop操作【模仿Django的admin】

    一.先看下什么django的admin的pop到底是个什么东西 其实就是这么一个东西, a.在添加页面,在一对多和多对多的项后加了一个+号 b.点击这个加号,会弹出对应的添加 页面,在新的添加 c.添 ...

  4. stark组件之批量操作【模仿Django的admin】

    一.先看下django的admin是如何实现批量操作 首先在配置类中定义一个函数 然后我们为这个函数对象设置一个属性,这个属性主要用来显示在select标签中显示的文本内容 最后把函数对象放到一个ac ...

  5. stark组件之搜索【模仿Django的admin】

    一.先看下django的admin是如何做搜索功能的 配置一个search_fields的列表就可以实现搜索的功能 class testbook(admin.ModelAdmin): # 第一步,定义 ...

  6. stark组件之过滤操作【模仿Django的admin】

    一.先看下django的admin是如何实现过滤操作 首先在配置类中顶一个list_filter的列表,把要过滤的字段作为元素写i进去就可以了 class testbook(admin.ModelAd ...

  7. stark组件之分页【模仿Django的admin】

    我们的stark组件用的我们的分页组件,没有重新写 下面直接看下分页的代码 class page_helper(): def __init__(self, count, current_page, p ...

  8. stark组件之注册与路由系统(三)

    在文章stark组件前戏中已经提到过,django的注册功能是通过AdminSite的单例进行组册的,所以在这里也可以进行单例模式. class AdminSite(object): def __in ...

  9. admin源码解析以及仿照admin设计stark组件

    ---恢复内容开始--- admin源码解析 一 启动:每个APP下的apps.py文件中. 首先执行每个APP下的admin.py 文件. def autodiscover(): autodisco ...

随机推荐

  1. vue.js 作一个用户表添加页面----初级

    使用vue.js 制作一个用户表添加页面,实际上是把原来需要使用js写的部分,改写成vue.js的格式 首先,想象一下,先做思考,我们要添加用户表,设涉及到哪些数据,一个是用户id,一个是用户名,一个 ...

  2. 【382】利用 namedtuple 实现函数添加属性

    namedtuple 能够实现类似类的效果,tuple 的元素可以通过属性的形式返回,如下所示: from collections import namedtuple Student = namedt ...

  3. Ajax 学习 第三篇

    1.什么是json 第一种方法 第二种方法 比较evar and jsondata 任何时候使用EVAR要特别小心,他不会管输入对象的类型 JSONLint可以在线校验代码的正确性 改写代码

  4. PowerDesigner 修改table背景色

    Tools->Display Preferences(显示参数选择)->Format->Table->Modify->Fill->Fill color 出处:htt ...

  5. 有关于分布式和SOA的理解

    我的理解分布式和SOA都差不多,类似功能独立分开.举个例子,做一辆车,按照传统模式,先生产车架,然后生产车轮..然后一辆车完成.现在分布式就是生产车架与生产车轮分离,所有的材料 就是最后一次组装的时候 ...

  6. 三种文本特征提取(TF-IDF/Word2Vec/CountVectorizer)及Spark MLlib调用实例(Scala/Java/python)

    https://blog.csdn.net/liulingyuan6/article/details/53390949

  7. 升级tensorflow1.0到1.3,报错ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory Failed to load the native TensorFlow runtime.

    先定位问题,发现在 /usr/local/cuda/include/ /usr/local/cuda/lib64/ 下面只有 libcudnn.so.5 因此,只要下载cudnn6.*版本的文件分别覆 ...

  8. Matlab练习——rpy2tr函数与自己实现的ZYX欧拉角的结果不同的问题

    问题背景:在根据<机器人导论>这本书的Z-Y-X欧拉角原理用Matlab实现旋转矩阵求解时,发现与直接调用机器人工具箱中的rpy2tr()函数得出的结果并不相同. 首先:先检查自己写的函数 ...

  9. c 中的单引号和双引号的使用

    1. 在c中,'A' 表示的是一个 character constant ,表示的是字符集的数值:而 "A" 表示的是一个字符串常量,代表的是指向字符串的指针.

  10. frambuffer 相关函数理解

    1. framebuffer_alloc()功能是向内核申请一段大小为sizeof(struct fb_info) + sizeprivate的空间,其中sizeprivate的大小代表设备的私有数据 ...