Django基于admin的stark组件创建(一)

时间:2022-09-03 19:18:50

首先创建一个名为stark_test的Django项目,创建2个app一个名为app01用来测试stark组件,一个就叫做stark,用来放stark组件

如图:Django基于admin的stark组件创建(一)

 我们这里使用的是Django自带的数据库,因为没什么影响,如果你想使用其他数据库也是一样的。

创建好项目后,就要思考一下,你想想Django项目app里面有个admin.py文件每次你启动的时候都会自动执行这个文件。所以我们也要创建一个类似的文件,我们创建名字为stark.py ,然后就要添加让其自动执行这个文件的方法了。

我们通过进去admin里面可以发现是这里面的代码使其能够自动执行admin.py .如图:

Django基于admin的stark组件创建(一)

我们也可以在stark里面的apps.py 里面添加以下代码用来实现其功能

from django.apps import AppConfig
# 导入模块
from django.utils.module_loading import autodiscover_modules

class StarkConfig(AppConfig):
    name = 'stark'
    # 启动Django时如果有ready方法会执行里面的代码
    def ready(self):
        autodiscover_modules('stark') # stark为要执行的py文件。

然后我们测试一下是否能自动执行。我们在app01下创建一个stark.py 文件在里面添加print("stark run!!!"),然后启动项目。发现能在启动时打印出stark run!!!了。如图:Django基于admin的stark组件创建(一)

然后我们就可以仿照admin源码进行编写我们的stark代码了。

首先在stark目录下创建一个名为services的python包。在里面创建一个stark.py文件。:

Django基于admin的stark组件创建(一)

我们要在这里面编写仿照admin的代码():

# 默认的样式。这里没怎么完善的
class ModelStark(object):
    def __init__(self, model, site):
        self.model = model
        self.site = site


# 自己编写一个类。仿照admin的结构
class StarkSite(object):
    def __init__(self):
        self._registry = {}

    def register(self, model, stark_class=None):
        # 判断是否有自定义的样式
        if not stark_class:
            stark_class = ModelStark
        self._registry[model] = stark_class(model, self)

# 形成单例模式(模块的单例模式)
site = StarkSite()

写完这里后,就要注册一下了。但是注册前要创建数据表用来测试。在app01的models.py里面创建一个表用来测

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()

然后进行makemigrations和migrate。生成表。

然后就进行注册了。没使用的注册:

# -*- coding: utf-8 -*-
# @Time    : 2019/4/11 下午 9:52
# @Author  : lh
# @Email   : 2470937072@qq.com
# @File    : stark.py
# @Software: PyCharm

from stark.service.stark import site, ModelStark
from .models import *


# # 自己定义样式不使用ModelStark的自带样式
# class UserInfoConfig(ModelStark):
#     pass


# 就像注册admin那样注册表进site里面
# site.register(UserInfo, UserInfoConfig)
site.register(UserInfo)
print(site._registry)

我们先看看没有使用stark的效果。

Django基于admin的stark组件创建(一)

把表注册进去。在app01的stark.py 里面编写:

# -*- coding: utf-8 -*-
# @Time    : 2019/4/11 下午 9:52
# @Author  : lh
# @Email   : 2@qq.com
# @File    : stark.py
# @Software: PyCharm

from stark.service.stark import site, ModelStark
from .models import *


# 自己定义样式不使用ModelStark的自带样式
class UserInfoConfig(ModelStark):
    pass


# 就像注册admin那样注册表进site里面
site.register(UserInfo, UserInfoConfig)
print(site._registry)

然后重启项目你会发现使用的是自己定义的样式:

Django基于admin的stark组件创建(一)

这就是最基础的stark搭建了。功能后面再完善