模拟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 ...
随机推荐
- WPF-DataGrid(数据表格)美化
我们不多哔哔先上图: 数据表格使用背景: 当我们在做二次开发发现我我们的表格无法向WEB的表格一样好看,这时我们就需要对数据表格进行美化和重构 表格美化思维引导: WPF数据表格是由表头和表体(内容) ...
- setsockopt()函数功能介绍
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时, 选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的 ...
- java 调用动态库打包sdk
java连接c++动态库并生成jar包提供给别人调用 1.需要将java通过jni生成头文件,并导入到c++项目并对c++进行jni方法继承 在项目的src目录执行,否则会提示 错误:找不到符号 ja ...
- linux的SHELL编程
管道 | 特殊的重定向 前一个命令的输出作为后一个命令的输入; 管道连接的命令数没有限制; who|wc−l统计用户数ps |sort|more 按序显示当前进程名 字符:具有特定作用的特殊字符 ,& ...
- 题解报告:hdu 1236 排名
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1236 Problem Description 今天的上机考试虽然有实时的Ranklist,但上面的排名 ...
- chromedriver与chrome版本对应
今天把手头有的一些关于selenium测试的资源整理了一下,分享出来. 1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是 ...
- 463 Island Perimeter 岛屿的周长
详见:https://leetcode.com/problems/island-perimeter/description/ C++: class Solution { public: int isl ...
- 1475 建设国家 DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1475 这题转化过来就是,给定n个点,每个点都有一个过期时间,一个价值.现 ...
- ASP.Net 控件
简单控件 Label -作用是显示文字,编译后元素是Span 1.文本类 边框: BorderColor 边框颜色 BordersTyle 边框样式 BorderWidth 边框粗细 Literal- ...
- js 验证码倒计时效果
function settime(obj) { if(second == 0){ obj.removeAttribute("disabled"); obj.value=" ...