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()
View Code

 改动反向生成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)

 

 

 

未完待续....

 

 

 

 

 

 

 

 

posted @ 2017-12-14 21:52  丶陌潇  阅读(159)  评论(0)    收藏  举报