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 的注册方式 与第一步相呼应

浙公网安备 33010602011771号