admin插件 ----MMP
目标:
开发出一个组件
制作项目启动时,自动加载文件
1 创建一个app
- 对于自定义的增删改查的组件
-python manage.py startapp stark
- 在每个app中创建一个stark.py文件
2 在stark app中的apps文件添加函数
def ready(self): from django.utils.module_loading import autodiscover_modules autodiscover_modules('stark')
- 去已注册的所有app中,找stark.py文件,并加载
- 'stark.apps.StarkConfig',
3 在starkapp中创建一个service文件--v1.py
由于执行app01时,stark文件自动先执行,我们需要导入一个文件
- from stark.service import v1
代码:第一步把想要的类完全注册成功
########### v1.py ####### """ 当这段代码写完之后,可以进行注册,只要注册成功就把注册的信息放在site._registry = {}中,
site._registry = {}放的就是当前类作为key,StarkConfig当做value """ class StarkConfig(object): def __init__(self,model_class,site): self.model_class = model_class self.site = site class StarkSite(object): def __init__(self): site._registry = {} def register(self,model_class,stark_config_class=None): #传参数model_class和stark_config_class if not stark_config_class: stark_config_class = StarkConfig self._registry[model_class] = stark_config_class(model_class,self) #stark_config_class实例化时需要两个参数 site = StarkSite()
自动生成url,四个url:
from django.conf.urls import url from django.shortcuts import HttpResponse,render class StarkConfig(object): def __init__(self,model_class,site): self.model_class = model_class self.site = site #封装site对象 def get_urls(self): url_patterns = [ url(r'^$',self.changelist_view), url(r'^add/$',self.add_view), url(r'^(\d+)/delete/$',self.delete_view), url(r'^(\d+)/change/$',self.change_view), ] return url_patterns @property def urls(self): return self.get_urls() ###############处理请求的方法############# def changelist_view(self, request, *args, **kwargs): return HttpResponse('列表') def add_view(self, request, *args, **kwargs): return HttpResponse('添加') def delete_view(self, request, *args, **kwargs): return HttpResponse('删除') def change_view(self, request, *args, **kwargs): return HttpResponse('修改') class StarkSite(object): def __init__(self): self._registry = {} """ site._registry中{ models.UserInfo:StarkConfig(models.UserInfo,self) :key就是 models.UserInfo对应的是StarkConfig(models.UserInfo,self)对象 """ def register(self,model_class,stark_config_class=None): #传参数model_class和stark_config_class if not stark_config_class: stark_config_class = StarkConfig self._registry[model_class] = stark_config_class(model_class,self) #stark_config_class实例化时需要两个参数 def get_urls(self): url_pattern = [] for model_class,stark_config_obj in self._registry.items(): # 根据site._registry自动生成url,为每一个类创建四个url """ /stark/app01/userinfo/ /stark/app01/userinfo/add/ /stark/app01/userinfo/(\d+)/change/ /stark/app01/userinfo/(\d+)/delete/ """ app_name = model_class._meta.app_label #当前app名称 model_name = model_class._meta.model_name #当前表名称 #前缀生成 curd_url = url(r'^%s/%s/' % (app_name, model_name,), (stark_config_obj.urls, None, None)) url_pattern.append(curd_url) return url_pattern @property #不用()来执行 def urls(self): #定义一个urls return (self.get_urls(),None,'stark') #return(列表,app名称,namespace) site = StarkSite()
改动反向生成url
def get_urls(self): # 拿到app、model和name的元组,通过逗号连起来 app_model_name = (self.model_class._meta.app_label,self.model_class._meta.model_name) #做格式化,根据自己的app名称,加自己的表名称再加自己的值反向生成url url_patterns = [ url(r'^$',self.changelist_view,name="%s_%s_changlist" %app_model_name), url(r'^add/$',self.add_view,name="%s_%s_add" %app_model_name), url(r'^(\d+)/delete/$',self.delete_view,name="%s_%s_delete" %app_model_name), url(r'^(\d+)/change/$',self.change_view,name="%s_%s_chang" %app_model_name), ] return url_patterns

def changelist_view(self, request, *args, **kwargs): cls_name = self.model_class._meta.model_name return HttpResponse('列表'+cls_name)

未完待续....

浙公网安备 33010602011771号