Stark组件就是在我们了解了admin组件的实现源码和流程之后,依据admin的执行流程来写一个完全自定义的增删改查组件
第一步:
扫描所有已注册app的stark文件
Django项目启动时会依次加载每一个已注册的app,每一个app文件中会按照
_ _init_ _.py
apps.py,而且会自动触发类中的ready函数
这样的顺序依次执行文件,所以我们要把扫描每一个stark.py文件的方法写到stark所在的app的apps.py文件中
from django.apps import AppConfig from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig): name = 'stark' def ready(self): print("stark扫描开始.....") autodiscover_modules('stark',)
这样就会加载执行每一个注册app中的stark.py文件了
第二步:就是依次执行每个app的stark文件了,比对admin的执行流程,我们也要创建两个类,使用单例模式,也要写register方法
第三步:就是URL配置,仍然仿照admin,定义urls方法,做路由分发
#starkapp中的stark.py文件 from django.conf.urls import url from django.shortcuts import HttpResponse class ModelStark(): """ 样式类 """ def __init__(self, model, site): # model对应的类对象,就是model中定义的类 self.model = model # StarkSite对象 self.site = site def model_list(self, request): return HttpResponse(self.model._meta.model_name+" index_list") def add(self,request): return HttpResponse("ADD") def edit(self, request): return HttpResponse("EDIT") def delete(self, request): return HttpResponse("DEL") @property def urls(self): return self.get_urls(), 'stark', None def get_urls(self): url_temp=[ url('^$', self.model_list), url('^add/$', self.add), url('^\d+/edit/$', self.edit), url('^\d+/del/$', self.delete), ] return url_temp class StarkSite(): """ 应用类 """ 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) @property def urls(self): return self.get_urls(), 'stark', None def index(self,request): return HttpResponse("INDEX") def get_urls(self): urlpatterns=[] for model, stark_model in self._registry.items(): # 所在的app文件名 app_label = model._meta.app_label # model对应的类名,也就是表名 model_name = model._meta.model_name r_url = url('^%s/%s/' % (app_label,model_name), stark_model.urls) urlpatterns.append(r_url) urlpatterns.append(url('^$', self.index)) return urlpatterns site = StarkSite()
第四步:就是就是扩展视图函数的功能了