admin组件详解
admin组件详解
先根据admin组件启动流程复习下django项目启动至请求过来发生的事
1将admin组件注册进app
2django项目启动
3在运行到定制的admin时执行其下面的apps文件中类下面ready函数在项目启动时就执行每个app下面的admin文件
4当用户发送请求进来首先经过wsgi处理
5再运行中间件中的各个组件对请求进行处理
6在url中找到对应的视图函数并执行返回一个response对象
7返回对象再经过中间件处理(此时执行顺序是从后往前)
流程
知识点
1、django admin利用的是python独有的单例模式来调用的再python中每一个py文件的执行都会生成一个pyc的文件,当下次再调用时,并不会在执行一次py文件, 而是拿到先前生pyc文件的空间中的数据。
2、 改写方法指定app启动时,执行每个app目录下的stark文件
def ready(self):
    autodiscover_modules('stark')
3通过查看源码admin中的注册方法通过site调用,site即一个文件类中产生的单例对象,新建文件定义一个生成site对象的方法,定义register方法
class StarkSite(object):
  def __init__(self, name='admin'):
    self._registry = {} #记录注册的model类
  def register(self, model, admin_class=None, **options):
    if not admin_class:
    admin_class = ModelStark # 配置类
    self._registry[model] = admin_class(model)
4model注册进此时应该生成对应的url,每张表都应该有自己独有的url,url对应着表中数据的增删改查,那么设计url尤为重要,此时我们采用url分发的方法,一级路由由表名进行命名,二级路由另外写个类,用来调用(因为site是单例,如果写在一个类里面,则每个url都需要生成4个url,代码重复,应该在用户访问某张表的时候生成对应的增删改查路由)
def get_urls(self):
 
    temp = []
 
 
    for model_class, config_obj in self._registry.items():
        print("===>", model_class, config_obj)
 
        model_name = model_class._meta.model_name
        app_label = model_class._meta.app_label
        print("===>", app_label, model_name)
 
        temp.append(url(r'^%s/%s/' % (app_label, model_name),config_obj.urls))                
5、config_obj是配置类对象,二级路由放入配置类中,在用户注册时,如果有自己的配置类则用自己的 ,没有则用默认的
def get_urls(self):
 
 
    temp=[
        url("^$",self.list_view,name="%s_%s_list"%(self.app_model_name)),
        url("^add/$",self.add_view,name="%s_%s_add"%(self.app_model_name)),
        url("^(\d+)/change/$",self.change_view,name="%s_%s_change"%            (self.app_model_name)),
        url("^(\d+)/delete/$",self.delete_view,name="%s_%s_delete"%(self.app_model_name)),
 
]
 
        temp.extend(self.extra_urls())
 
        return temp
@property                               #此装饰器的作用是让方法变成可以像属性一样调用
def urls(self):
     return self.get_urls(),None,None
6在装饰类下定义增删改查4个视图方法
流程图
>
至于增删改查视图中的方法就步过介绍了,自定义admin组件的基本逻辑就是这样
 
  您的资助是我最大的动力!
金额随意,欢迎来赏!

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号