开始今日份整理
保证django自动的加载每一个app下的stark.py文件
from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig): name = ‘stark‘ def ready(self): autodiscover_modules(‘stark‘)
所谓注册就是仿照admin模块,对于注册的数据表进行记录,方便后面的url的增删改查
仿照admin在stark下创建一个包services,并创建一个sites.py文件,代码如下
from django.contrib import admin from django.urls import path from django.shortcuts import render,HttpResponse class ModelStark(object): list_display =("__str__") def __init__(self,model): self.model = model def list_view(self, request): return render(request,‘stark/list_view.html‘,locals()) def add_view(self, request): return HttpResponse("add_view") def change_view(self, request, id): return HttpResponse("change_view") def delete_view(self, request, id): return HttpResponse("delete_view") @property def get_url(self,): temp = [ path("", self.list_view), path("add/",self. add_view), path("(\d+)/change/", self.change_view), path("(\d+)/delete/", self.delete_view), ] return (temp, None, None) class StarkSite: def __init__(self): self._registry ={} def register(self,model,admin_class=None,**options): admin_class = admin_class or ModelStark self._registry[model]=admin_class(model) def get_urls(self): temp =[] # 拿到已经注册的所有表 for model,config_obj in self._registry.items(): # 表名 model_name = model._meta.model_name # 项目名 model_label = model._meta.app_label temp.append( path("%s/%s/"%(model_label,model_name),config_obj.get_url) ) return temp @property def urls(self): return self.get_urls(),None,None site = StarkSite()
在app01中创建stark.py文件,并注册
from stark.services.sites import site,ModelStark from .models import Book,Publish,Author,Author_detail # 分别注册书籍,出版社以及作者 site.register(Book) site.register(Publish) site.register(Author) print(site._registry)
打印注册的列表,结果如下
{<class ‘app01.models.Publish‘>: <stark.services.sites.ModelStark object at 0x04B66B50>, <class ‘app01.models.Book‘>: <stark.services.sites.ModelStark object at 0x04B669B0>, <class ‘app01.models.Author‘>: <stark.services.sites.ModelStark object at 0x04B66970>}
这样就注册成功了
(1)在site中StarkSite类中创建一个URLS(self)方法,用@property方式,静态方法
(2)将二级分发功能放在配置类模块中
(3)配置类中self以及self.model的区别(超级重要)
self:是配置类对象
self.model:数据表对象,其实就是数据表的数据
通过上面:即可理解为什么在注册的时候有一个空字典,在每一个表对象进行注册时,对每一个表生成对应的配置类对象,如果一个表对象有自己的自定义样式,则会走自己自定义样式,无则会走默认样式。
这样就基本实现了url的分发功能,有一级也有二级分发。这块内容就是理解就会觉得东西少,不理解则东西好多!,只需要记住
self是配置类,self.model就是数据表对象就可以了。
from django.contrib import admin from django.urls import path from django.shortcuts import render,HttpResponse class ModelStark(object): list_display =("__str__") def __init__(self,model): self.model = model def list_view(self, request): return render(request,‘stark/list_view.html‘,locals()) def add_view(self, request): return HttpResponse("add_view") def change_view(self, request, id): return HttpResponse("change_view") def delete_view(self, request, id): return HttpResponse("delete_view") @property def get_url(self,): temp = [ path("", self.list_view), path("add/",self. add_view), path("(\d+)/change/", self.change_view), path("(\d+)/delete/", self.delete_view), ] return (temp, None, None) class StarkSite: def __init__(self): self._registry ={} def register(self,model,admin_class=None,**options): admin_class = admin_class or ModelStark self._registry[model]=admin_class(model) def get_urls(self): temp =[] # 拿到已经注册的所有表 for model,config_obj in self._registry.items(): # 表名 model_name = model._meta.model_name # 项目名 model_label = model._meta.app_label temp.append( path("%s/%s/"%(model_label,model_name),config_obj.get_url) ) return temp @property def urls(self): return self.get_urls(),None,None site = StarkSite()
a
Django-CRM项目学习(二)-模仿admin实现stark
原文:https://www.cnblogs.com/gbq-dog/p/10711773.html