模拟Django的admin自定义stark组件
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组件的更多相关文章
- admin源码解析以及仿照admin设计stark组件
---恢复内容开始--- admin源码解析 一 启动:每个APP下的apps.py文件中. 首先执行每个APP下的admin.py 文件. def autodiscover(): autodisco ...
- admin源码解析及自定义stark组件
admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单 ...
- 10.15仿admin开发stark组件(一)
2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...
- 关于模拟admin实现stark组件的知识点
一. url知识 还记得include分发么?里面的参数都可以有些什么? urlconf_module本质是返回的是模块路径对象 def include(arg, namespace=None, ap ...
- CRM系统之stark组件流程分析
CRM系统主要通过自定义stark组件来实现的(参照admin系统自定义): STARK组件: 1 admin组件 1 如何使用admin 2 admin源码 3 创建自己的admin组件:stark ...
- 模拟admin组件自己开发stark组件之自定义list_display,反向解析url
反向解析 在上一篇文章中,我们创建好了stark这个组件,一个应用一个表有四个默认的url,那么我们如何区别这些url,因为可能会有重复现象(本组件不会,因为前面拼接了应用名,表明,肯定唯一),概念请 ...
- 仿照admin的stark自定义组件的功能实现
仿照admin的stark自定义组件的功能实现:其中最主要的就是增删改查的实现 1.查:首先页面中显示表头和数据,都是动态的,而不是写死的. (1) 先看表头和表单数据:这个是查看的视图函数,但是为了 ...
- stark组件之批量操作【模仿Django的admin】
一.先看下django的admin是如何实现批量操作 首先在配置类中定义一个函数 然后我们为这个函数对象设置一个属性,这个属性主要用来显示在select标签中显示的文本内容 最后把函数对象放到一个ac ...
- stark组件之注册【模仿Django的admin】
一.先看下django的admin是如何实现注册功能 首先导入admin这个对象和我们的model模块 from django.contrib import admin # Register your ...
随机推荐
- VS2010创建C++静态链接库创建和使用
VS2010创建C++静态链接库的方法: 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入 staLIB.点击确定. 2.在解决方案资源管理 ...
- 牛客小白月赛5-D-阶乘(求n内每个数的阶乘相乘后尾数为0的个数)
题目描述 输入描述: 输入数据共一行,一个正整数n,意义如“问题描述”. 输出描述: 输出一行描述答案:一个正整数k,表示S的末尾有k个0 输入例子: 10 输出例子: 7 --> 示例1 输入 ...
- 自定义View(12)绘制.9图片
代码如下: // 绘制.9图片 void draw9Path(Canvas canvas){ //创建一个ninePatch的对象实例,第一个参数是bitmap.第二个参数是byte[],这里其实要求 ...
- 阿里云OSS搭建移动应用直传服务的.Net C#示例
OSS好几个都没有.Net示例,只有SDK 于是我就拿Java改成C#代码:使用前先去Nuget包管理器下载Aliyun.Acs.Core还有Aliyun.Acs.Sts: 在安装这个两个包的时候安装 ...
- 帮助新手理解equals和hashCode
入行快要两年,偶尔想起来equals和hash还是会有些晕,索性今天就更深入的弄明白一些,不足之处也请各位大神指出批评,共同进步. 刚开始学java的时候只是记忆性的来背,如果一个类在程序中可能进行比 ...
- 微服务熔断限流Hystrix之Dashboard
简介 Hystrix Dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard可以直观地看到各Hystrix Command的请求响应时间,请求成功率等数据 ...
- 学生管理系统之Java+Mysql
主页面: 代码如下:package appstu.view; import java.awt.BorderLayout;import java.awt.Dimension;import java.aw ...
- Jmeter之WebService接口测试
一.简介 1.JMeter3.2前的版本,可以使用SOAP/XML-RPC Request插件直接进行webservice接口,而3.2后的版本则已经取消了这个接口,需要另外的方法才能进行测试. 2 ...
- hibernate inverse属性
修改街道对应的区道信息: 修改后会发现程序执行了两次修改操作: 原因: 区道与街道是一对多的关系: 由于Hibernate是双向维护外键,所以当修改区道中的街道时,会修改一次外键:在修改街道中的区道时 ...
- JVM中常见的垃圾收集器
垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率.如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java 的垃圾收集机制仍然在不断的演进中,不同大小的设备.不同特征的应用 ...