1、新建Django项目--新建app:app01和stark--在settings中配置app和数据库--在models.py中新建模型表--完成数据库迁移

2、在stark下的apps.py中:

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig):
name = 'stark' def ready(self):
autodiscover_modules('stark') # 在程序启动后、url路由分配之前去找到叫stark的app

3、在settings中配置stark:

4、在app01下新建stark.py文件,完成模型表注册:

from stark.service.stark import *
from django.utils.safestring import mark_safe
from django.urls import reverse
from .models import * class UserInfoConfig(ModelStark):
def edit(self, data_obj):
"""编辑"""
model_name = self.model._meta.model_name # 表名
app_label = self.model._meta.app_label # app名
_url = reverse("%s_%s_edit" % (app_label, model_name), args=(data_obj.pk,)) # 反向解析 拿到url
return mark_safe("<a href='%s'>编辑</a>" % _url) # 防止转义 def checkbox(self, data_obj):
"""每条记录前面插入一个选择框"""
return mark_safe("<input type='checkbox'>") list_display = [checkbox, "name", "age", edit] class BookConfig(ModelStark):
list_display = ["title", "price", "pub_date"] site.register(UserInfo, UserInfoConfig)
site.register(Book, BookConfig) print("_registry:", site._registry) """
函数:函数中有多少个参数,就要传递多少各参数,不存在自动传参
方法:自动将调用对象作为第一个参数进行传递
"""

5、在stark下新建包service--service下新建stark.py文件:

from django.conf.urls import url
from django.shortcuts import HttpResponse, render class ModelStark(object):
list_display = [] def __init__(self, model, site):
self.model = model # 用户当前访问的模型表
self.site = site def add(self, request):
"""新增记录"""
return HttpResponse("add") def delete(self, request, delete_id):
"""删除记录"""
return HttpResponse("delete") def edit(self, request, edit_id):
"""编辑"""
return HttpResponse("edit") def show(self, request):
"""查看"""
data_list = self.model.objects.all() # 获取数据 new_data_list = []
if self.list_display:
for data_obj in data_list: # 数据对象
temp = []
for field in self.list_display: # 字段名
if callable(field): # 判断是否为函数
val = field(self, data_obj)
else:
val = getattr(data_obj, field) # 通过反射获取字段对应的数据
temp.append(val)
new_data_list.append(temp) return render(request, "listInfo.html", locals()) def get_method(self):
"""增删改查url"""
method_list = []
model_name = self.model._meta.model_name
app_label = self.model._meta.app_label
method_list.append(url(r'^add/', self.add, name="%s_%s_add" % (app_label, model_name)))
method_list.append(url(r'^(\d+)/delete/', self.delete, name="%s_%s_delete" % (app_label, model_name)))
method_list.append(url(r'^(\d+)/edit/', self.edit, name="%s_%s_edit" % (app_label, model_name)))
method_list.append(url(r'^$', self.show, name="%s_%s_show" % (app_label, model_name)))
return method_list @property
def urls2(self):
return self.get_method(), None, None class StarkSite(object):
def __init__(self):
self._registry = {} def register(self, model, stark_class=None):
if not stark_class:
stark_class = ModelStark self._registry[model] = stark_class(model, self) def get_urls(self):
"""拼接url"""
urls_list = []
for model, stark_class_obj in self._registry.items():
model_name = model._meta.model_name # 模型表
app_label = model._meta.app_label # app名称
print(model_name, app_label)
# 添加url
urls_list.append(url(r'^%s/%s/' % (app_label, model_name), stark_class_obj.urls2))
"""
url(r'^app01/userinfo/', UserInfoConfig(UserInfo).urls2),
url(r'^app01/book/', ModelStark(Book).urls2),
"""
return urls_list @property
def urls(self):
return self.get_urls(), None, None site = StarkSite()

6、templates下新建模板

7、全局urls.py:

from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url
from stark.service import stark urlpatterns = [
path('admin/', admin.site.urls), # 自定义stark组件
url('^stark/', stark.site.urls),
]
"""
admin源码:
1、注册
admin.py
admin.site.register()
2、url设计
在ModelStark中:
self.model :用户当前访问的模型表 查看页面:
表头
表数据
search
actions
分页
filter 增删改(modelForm) pop功能 作业:
访问任何模型表时都有编辑、删除、选择框
如果用户没有配置的list_display,如何显示数据
"""

模拟Django的admin自定义stark组件的更多相关文章

  1. admin源码解析以及仿照admin设计stark组件

    ---恢复内容开始--- admin源码解析 一 启动:每个APP下的apps.py文件中. 首先执行每个APP下的admin.py 文件. def autodiscover(): autodisco ...

  2. admin源码解析及自定义stark组件

    admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单 ...

  3. 10.15仿admin开发stark组件(一)

    2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...

  4. 关于模拟admin实现stark组件的知识点

    一. url知识 还记得include分发么?里面的参数都可以有些什么? urlconf_module本质是返回的是模块路径对象 def include(arg, namespace=None, ap ...

  5. CRM系统之stark组件流程分析

    CRM系统主要通过自定义stark组件来实现的(参照admin系统自定义): STARK组件: 1 admin组件 1 如何使用admin 2 admin源码 3 创建自己的admin组件:stark ...

  6. 模拟admin组件自己开发stark组件之自定义list_display,反向解析url

    反向解析 在上一篇文章中,我们创建好了stark这个组件,一个应用一个表有四个默认的url,那么我们如何区别这些url,因为可能会有重复现象(本组件不会,因为前面拼接了应用名,表明,肯定唯一),概念请 ...

  7. 仿照admin的stark自定义组件的功能实现

    仿照admin的stark自定义组件的功能实现:其中最主要的就是增删改查的实现 1.查:首先页面中显示表头和数据,都是动态的,而不是写死的. (1) 先看表头和表单数据:这个是查看的视图函数,但是为了 ...

  8. stark组件之批量操作【模仿Django的admin】

    一.先看下django的admin是如何实现批量操作 首先在配置类中定义一个函数 然后我们为这个函数对象设置一个属性,这个属性主要用来显示在select标签中显示的文本内容 最后把函数对象放到一个ac ...

  9. stark组件之注册【模仿Django的admin】

    一.先看下django的admin是如何实现注册功能 首先导入admin这个对象和我们的model模块 from django.contrib import admin # Register your ...

随机推荐

  1. java基本数据类型所占字节数

    JAVA基本数据类型所占字节数是多少?(32位系统) byte     1字节                short    2字节                int      4字节      ...

  2. _bzoj1061 [Noi2008]志愿者招募【最小费用最大流】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 尽管不是mcmf的裸题,但还是保存一下模版叭~ 很好的一道建模的题,把变量间的加加减减 ...

  3. bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOn ...

  4. Linux的proc文件系统 分类: linux 2014-06-02 10:21 623人阅读 评论(0) 收藏

    proc为一个内核数据结构接口,用户空间和内核空间可以通过该接口通信, 与普通文件不同的是,这些虚拟文件的内容都是动态创建的. proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间. ...

  5. Android偏好设置(1)概述和Preferences简介

    1.Overview Instead of using View objects to build the user interface, settings are built using vario ...

  6. 转】用Mahout构建职位推荐引擎

    原博文出自于: http://blog.fens.me/hadoop-mahout-recommend-job/ 感谢! 用Mahout构建职位推荐引擎 Hadoop家族系列文章,主要介绍Hadoop ...

  7. java 线程池第一篇 之 ThreadPoolExcutor

    一:什么是线程池? java 线程池是将大量的线程集中管理的类,包括对线程的创建,资源的管理,线程生命周期的管理.当系统中存在大量的异步任务的时候就考虑使用java线程池管理所有的线程.减少系统资源的 ...

  8. 理清楚HTML和DHTML和XML的概念

    DHTML 不是 W3C 标准DHTML 指动态 HTML(Dynamic HTML).DHTML 不是由万维网联盟(W3C)规定的标准.DHTML 是一个营销术语 - 被网景公司(Netscape) ...

  9. lua 之 and or not

    and是与运算,返回值如下 如果前者为false或者nil,则返回前者,否则后者 A and B 类似如下语句 if not A then return A else return B end 总结: ...

  10. CAD交互绘制多段线(com接口)

    多段线又被称为多义线,表示一起画的都是连在一起的一个复合对象,可以是直线也可以是圆弧并且它们还可以加不同的宽度. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下 ...