admin表的注册 django项目启动要走的内容

 项目启动的时候

 

代码

from django.contrib import admin

# Register your models here.

from .models import *
admin.site.register(Book)

admin.site.register(Userinfo)

print('这是app02的')
print(admin.site._registry)
#{<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x00000054B9E5A7F0>,
#  <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x00000054B9E896A0>,
#  <class 'app01.models.Publish'>: <django.contrib.admin.options.ModelAdmin object at 0x00000054B9E89710>}
#这里封装了三个键值对,前两个是 jiango自带的,最后一个就是上边注册的   admin.site.register(Userinfo)
#  这里边  键是  模板类的对象  值是这个对象的类型


#当运行扫面到第二个stark 文件夹中的admin中时,再次打印print(admin.site._registry)
#  打印出了五组键值对,其中前三个正是这里边的三个,证明,site对象是一个单例对象

 

 

 

 

URL路由分发

一级分发

 二级分发

 

 

 

 

 

 

 

 stark路由分发流程图

 

 

 在admin页面上设置自定义的表单样式中的 list_display样式后得到的效果

 

设置好之后的显示效果

 

子类与父类的继承关系    

 

 

结论,自己的对象中有此属性就用自己的,  如果没有这个属性的化就继承父类的

二级分发的大体函数式子

 

写自定义的类似与admin   的一个模块  stark 

代码和位置

1.写代码仿照admin中的函数(一启动项目就自动加载文件名为admin的py 文件)所写的内容,让他起到一启动项目就自动加载文件名为stark.py的文件

 

from django.apps import AppConfig
# def autodiscover():
#     autodiscover_modules('admin', register_to=site)
#admin也是用的这个模块来让
# 项目启动后自动加载所有文件名为’admin‘的py文件
#仿照上边的这句话,来改写代码

#先引入模块
from django.utils.module_loading import autodiscover_modules

class StarkConfig(AppConfig):
    name = 'stark'

    def ready(self):
        #项目启动后让项目自动扫面没给文件名为  stark.py的文件
        autodiscover_modules('stark',)

 

2.URL的设计和类似于admin中的site 例对象的父类的定义和使用

#encoding=utf-8
from django.conf.urls import url
#引入此函数才能进行URL的使用
from django.shortcuts import render,HttpResponse


#j将涉及到样式类的内容方到这个ModelStark中,他不是单例对象,可以对不同的表单定制不同的样式类
class ModelStark(object):
    def __init__(self,model,site):
        self.model=model  #用户当前访问类
        self.site=site

   #设定视图函数的不同样式,这种个性化设置的 不是单例对象的要放到这里
def show_List(self,request): ret=self.model.objects.all() return render(request,'showlist.html',{'ret':ret}) def add_view(self,request): return HttpResponse('add_view') def change_view(self,request,id): return HttpResponse('change_view') def del_view(self,request,id): return HttpResponse('del_view')
  # 定义一个函数,实例化的对象可以通过对象名.urls的方法来调用这个函数中的内容 @property
def urls(self): temp=[] temp.append(url('^$',self.show_List)) temp.append(url('^add/$',self.add_view)) temp.append(url('^(\d+)/change/$',self.change_view)) temp.append(url("^(\d+)/delete/$", self.del_view)) return temp class StarkSite(object): def __init__(self): #定义一个静态属性,是空字典用于存放用户注册的模板类的名称和样式 self._registry={} #自定义一个注册函数 def register(self,model,model_config=None): if not model_config: model_config=ModelStark #函数的功能是给字典写入键值对键是 模板中的类对象,值是类型 self._registry[model]=model_config(model,self) #此函数用于写入url列表, def get_urls(self): #创建一个空的列表,用于写入url temp=[] #从对象的_registry中取出键值对,存放在下边的值中, 使用下边的方法来存放字符串 for model,model_config in self._registry.items(): #获取model的字符串类型的名字 model_name=model._meta.model_name #获取app字符串类型的名字 app_label=model._meta.app_label #model_config就是一个的是上边ModelStark类实例化的对象 u=url('^%s/%s/'%(app_label,model_name),(model_config.urls,None,None)) #后边的(model_config.urls,None,None)是一个二级分发这个model_config.urls中的内容见上,是存放增删改查的url内容 #这个url最后组成的形式就是类似于 url文件中写的 # urlpatterns = [ # url(r'^admin/', admin.site.urls), # url(r'^user/', user) # ] temp.append(u) #返回列表存放好URL内容的列表 return temp @property def urls(self): return self.get_urls(),None,None #实例化一个单例对象,类似于admin中的单例对象 site=StarkSite()

 

 

 

3吧模板对象类注册在stark.py的文件上,仿照admin 的注册方式   与第一步相呼应

 

 

posted on 2018-03-09 22:28  王大拿  阅读(213)  评论(0)    收藏  举报

导航