Django-CRM项目学习(二)-模仿admin实现stark

时间:2019-04-15
本文章向大家介绍Django-CRM项目学习(二)-模仿admin实现stark,主要包括Django-CRM项目学习(二)-模仿admin实现stark使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

开始今日份整理

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