1. 程式人生 > >Django-CRM項目學習(二)-模仿admin實現stark

Django-CRM項目學習(二)-模仿admin實現stark

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