Django-CRM項目學習(二)-模仿admin實現stark
阿新 • • 發佈:2019-04-15
sco auto add 有一個 分享圖片 loading nbsp als -i
開始今日份整理
1.stark模塊基本操作
1.1 stark模塊的啟動
保證django自動的加載每一個app下的stark.py文件
- 創建django項目,創建stark項目,start app stark
- settings註冊app
- stark.app中的apps.py創建def(函數名必須是ready才會自動執行)
from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig): name = ‘stark‘ def ready(self): autodiscover_modules(‘stark‘)
1.2 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.3 URL的分發功能以及頁面樣式理解(非常重要)
(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()stark核心代碼
a
Django-CRM項目學習(二)-模仿admin實現stark