模拟admin组件自己开发stark组件之自定义list_display,反向解析url
反向解析
在上一篇文章中,我们创建好了stark这个组件,一个应用一个表有四个默认的url,那么我们如何区别这些url,因为可能会有重复现象(本组件不会,因为前面拼接了应用名,表明,肯定唯一),概念请转至http://www.cnblogs.com/jokerbj/p/8337486.html反向解析,解决url重复问题
命名空间
我们解决了url问题,但是有可能每个应用下也会存在url相同,这个时候django只会标识其中一个,为了解决这个问题,我们加入命名空间概念,转至http://www.cnblogs.com/jokerbj/p/8337486.html
admin反向解析
我们针对上一篇文章在url上的修改为下面,在默认的样式类里面,而且是在首页上点击a标签
#================================= url相关解析
# 反向解析名称空间的增删改查
def get_edit_url(self,id): # 反向解析的url,传id肯定是修改或者删除
print('====',id)
c_url = "joker:%s_%s_edit" % (self.model._meta.app_label,self.model._meta.model_name)
print(c_url)
edit_url = reverse(c_url,args=(id,))
return edit_url
pass
def get_del_url(self,id): # 反向解析的url,传id肯定是修改或者删除
c_url = "joker:%s_%s_delete" % (self.model._meta.app_label, self.model._meta.model_name)
del_url = reverse(c_url, args=(id,))
return del_url def get_list_url(self): # 反向解析的url,传id肯定是修改或者删除
c_url = "joker:%s_%s_list" % (self.model._meta.app_label, self.model._meta.model_name)
list_url = reverse(c_url)
return list_url
#=================================显示的样式,和url的反向
# 我这里给予页面一些默认的按钮,选择按钮,操作按钮
def edit(self,obj=None,is_header=False): # 默认编辑按钮
if is_header:
return 'op'
else:
return mark_safe("<a href='%s'>edit</a>" % self.get_edit_url(obj.id)) # 调用反向解析出来的url def delete(self,obj=None,is_header=False): # 默认编辑按钮
if is_header:
return 'op'
else:
return mark_safe("<a href='%s'>del</a>" % self.get_del_url(obj.id)) def checkbox(self,obj=None,is_header=False): # 默认多选框
if is_header:
return 'select'
else:
return mark_safe("<input type='checkbox'>")
def get_urls(self): # 默认的增删改查
# 我这里获取的URL是不是应该加入别名?反向解析呢?
# url( 正则,视图(元祖,列表),命名空间)
app_model_name = (self.model._meta.app_label,self.model._meta.model_name) # 应用名称,表名称
temp=[
url("^$",self.list_view,name="%s_%s_list" % app_model_name),
url("^add/$",self.add_view,name="%s_%s_add" % app_model_name),
url("^(\d+)/change/$",self.change_view,name="%s_%s_edit" % app_model_name), ### 注意小括号
url("^(\d+)/delete/$",self.delete_view,name="%s_%s_delete" % app_model_name),
]
return temp
#============================url
@property # 获取URL
def urls(self):
return self.get_urls(), None, 'joker' # URL 第三个参数是命名空间 ### 注意这里我加入了名称空间
admin自定义显示内容
我们可以对用户自己控制的显示内容做显示,利用类的继承,重写,有自己的用自己的,没有用父类的
父类我们给予一些默认的,表头和数据,表头是'op',数据是一个带有反向解析的a标签
应用app01里面stark.py里面注册内容为
class bookjoker(joker.ModelAdmin): # 自定义样式类
list_display = ('id','title',) joker.site.register(models.Book,bookjoker)
在样式类获取页面要显示的dis_play
class ModelAdmin(object): # 默认样式
list_display = () # 自定义展示,用户有没有自定义
def get_list_display(self): # 得到需要展示的内容
default_list_display=[] if self.list_display:
default_list_display.extend(self.list_display)
default_list_display.append(ModelAdmin.edit) # 添加的是对象,不是字符串
default_list_display.append(ModelAdmin.delete) # 添加的是对象,不是字符串
default_list_display.insert(,ModelAdmin.checkbox) # 添加的是对象,不是字符串
else:
pass ####### 自定义如果是空,那么如何显示???,在下面判断 list_display为空,也就是用户为空 return default_list_display
样式类有个处理表头,和数据的,在list_vies上
def list_view(self,request):
# list_display = (checkbox,"id","title",edit,delete) # 处理表头,也就是第一行内容,如果数据库有verbose_name字段,就会拿到这个名称
head_list = []
for field_name in self.get_list_display(): # id title edit
if isinstance(field_name,str):
###### 字符串,肯定就是字段了,例如 title字段到这里,就会得到verbose_name名字,如果没有verbose_name那就是本身名称
verbox_name = self.model._meta.get_field(field_name).verbose_name
else:
# checkbox edit走这里
verbox_name = field_name(self,is_header=True) ##### 判断是不是头
head_list.append(verbox_name)
if not self.list_display: #### 没有list_display
head_list = ['选择',self.model._meta.model_name.upper(),] print('==head_list==',head_list) # ['ID', '书籍名称', 'op'] # 处理数据
data_list = self.model.objects.all() # 得到所有数据库数据
print('==data_list==',data_list) # <QuerySet [<Book: linux>, <Book: python>, <Book: go>]> new_data_list = [] # [[, 'linux', "<a href='1/chagnge'>edit</a>"], [, 'python', "<a href='2/chagnge'>edit</a>"], [, 'go', "<a href='3/chagnge'>edit</a>"]] for obj in data_list: # 每一个对象
temp = [] if not self.list_display: # 没有dis_play,给予默认头,信息,显示对象
temp.append(self.checkbox(obj))
temp.append(obj)
else:
for field_name in self.get_list_display(): # (checkbox,"id","title",edit,delete)
if isinstance(field_name,str):
var = getattr(obj,field_name) # 拿到对象相对应的字段的值
else:
var = field_name(self,obj) # 不是对象里面的字段,执行自己样式方法,但是我要把这个obj传过去,为了修改删除
temp.append(var) new_data_list.append(temp) print('==new_data_list==',new_data_list)
return render(request,"joker/change_list.html", locals())
模拟admin组件自己开发stark组件之自定义list_display,反向解析url的更多相关文章
- 模拟admin组件自己开发stark组件之创建篇
admin组件 admin组件为我们提供了针对django管理页面 我们先简短来看下django的admin组件的启动流程,注册流程,url匹配过程 启动注册 1. 扫描所有应用下的注册了应用中的ad ...
- 模拟admin组件自己开发stark组件之搜索和批量操作
搜索相关,搜索的本质就是从数据库查询出来的数据过滤 用户自定义给出过滤条件joker.py list_display = ('id','title','price',) show_add_btn = ...
- 模拟admin组件自己开发stark组件之增删改查
增删改查,针对视图 我们需要modelform来创建,可自动生成标签,我们还要考虑用户是不是自己定制,依然解决方法是,继承和重写 app01下的joker.py文件 class BookModelFo ...
- 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick
wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...
- 10.18正式开发stark组件*(三)
2018-10-18 19:15:54 等这个stark组件做完了再上传到github上面,然后再整理博客!这就到周末啦! 因为models导入的时候出现bug,所以只有源码没有测试数据! 源码都有注 ...
- 10.16 正式开发stark组件(一)
2018-10-16 17:26:44 Django MTV 路由配置里面有 反向解析 参考连接:https://www.cnblogs.com/yuanchenqi/articles/762993 ...
- Agile.Net 组件式开发平台 - 组件开发示例
所谓组件式开发平台,它所有的功能模块都是以组件的形式扩展的,下面我来演示一个简单的组件开发例程. Agile.Net开发管理平台项目,已经托管在开源中国码云平台(http://git.oschina. ...
- 10.15仿admin开发stark组件(一)
2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...
- django 之 stark组件
----------------------------------------------------------------烦恼没完没了,内心动荡不安,呜呼哀哉. 一.有个特殊的需求,需要用sta ...
随机推荐
- Linux下常用压缩、解压缩命令
常用的压缩工具 一是单纯的单文件压缩工具,主要有compress,gzip,bzip2. 二是打包压缩工具,也是最常用的,tar 压缩比:compress<gzip<bzip2 co ...
- 20165202 学习基础和c语言基础调查
你有什么技能比大多人(超过90%以上)更好? 我对自行车运动的兴趣始于初中时期,不敢说比大多数人更好,但在业余爱好者中相对来说还不错. 针对这个技能的获取你有什么成功的经验? 接触自行车运动几年里,我 ...
- RxJava 1.x 笔记:创建型操作符
本篇文章是阅读 官方文档 的笔记. 作者:shixinzhang(百度搜索 "shixinzhang CSDN" 即可找到我) RxJava 也用了有段时间,那么多操作符总不想去记 ...
- [Python] re正则表达式指南以及常用操作
一.语法 1. 使用正则表达式进行匹配的流程 2. Python支持的正则表达式元字符和语法 参考: AstralWind的Python正则表达式指南 官方文档:7.2. re — Regular e ...
- Extjs 5 可选择日期+时间的组件DateTimeField
我们都知道ExtJs有日期组件DateField,但直到ExtJs 5.0版本该日期组件也只能选择日期,不能选择时间(具体到时.分.秒),而实际工作中又常常会有需要日期和时间同时选择的需求,我们只能自 ...
- matlab下利用K-Means进行图像分类
FIRST & BEST SOLUTION clear all; clc; I_rgb=imread('dog.jpg'); figure();imshow(I_rgb);title('原始图 ...
- Redis安全性配置
最近Redis刚爆出一个安全性漏洞,我的服务器就“光荣的”中招了.黑客攻击的基本方法是: 扫描Redis端口,直接登录没有访问控制的Redis 修改Redis存盘配置:config set dir / ...
- ios 延迟调用 && UIImageView && UILabel && UISegmentedControl && UISwitch && UISlider
// // ViewController.m // UI_Lesson3 // // Created by archerzz on 15/8/13. // Copyright (c) 2015 ...
- 新的开源java反汇编程序Procyon
wiki:https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler 由于jd好多年没更新了,今天找到这个新的开源反汇编,很不错 分享一 ...
- Luogu 4149 Race
Luogu 4149 Race 用点分治解决. 点分治在计算路径贡献时,为了不统计在一颗子树中的路径,解决方法一种是容斥,但在这种求最值问题中不便用容斥来撤销. 另一种则是,处理一颗子树时,只考虑前面 ...