10.10xadmin
2018-10-10 15:11:55
这几天讲的是xadmin插件
就是把表单,数据内容封装到类里面,简化的增删改查步骤!
放上源代码:
app01/xadim.py
from django.contrib import admin
# Register your models here.
from Xadmin.service.Xadmin import site,ModelXadmin
print("app01 Xadmin")
from app01.models import *
from django.utils.safestring import mark_safe
class BookConfig(ModelXadmin):
def edit(self,obj=None,is_header=False):
if is_header:
return "操作"
# 反向解析:url
return mark_safe("<a href='%s/change/'>编辑</a>"%obj.pk)
def delete(self,obj=None,is_header=False):
if is_header:
return "操作"
return mark_safe("<a href=''>删除</a>")
def check(self,obj=None,is_header=False):
if is_header:
return "选择"
return mark_safe("<input type='checkbox'>")
list_display=[check,"nid","title","publish",edit,delete]
#list_display=["nid","title","publish"]
site.register(Book,BookConfig)
site.register(Publish)
site.register(Author)
site.register(AuthorDetail)
app02/xadmin.py
from Xadmin.service.Xadmin import site,ModelXadmin from app02.models import * site.register(Order) class FoodConfig(ModelXadmin):
list_display = ["id","title"]
site.register(Food,FoodConfig) print("_registry",site._registry)
Xadmin/service/xadmin.py
from django.conf.urls import url
from django.shortcuts import HttpResponse,render,redirect
class ModelXadmin(object):
list_display=["__str__",]
def __init__(self,model,site): self.model=model
self.site=site def list_view(self, request):
print("self.model", self.model) # 用户访问哪张表,self.model就是谁。
model_name=self.model._meta.model_name
data_list = self.model.objects.all()
print("list_display:",self.list_display) ## ['title', 'prcie'] # 处理表头
#header_list=["ID","书籍名称","出版社"]
header_list=[] for field in self.list_display: # [check,"nid","title","publish",edit,delete]
if isinstance(field,str):
if field=="__str__":
val= self.model._meta.model_name.upper()
else:
field_obj=self.model._meta.get_field(field)
val=field_obj.verbose_name else:
val=field(self,is_header=True) # 获取表头,传is_header=True header_list.append(val)
# 处理表单数据
new_data_list=[]
for obj in data_list: # data_list [book_obj,book_obj2,...] temp=[]
for field in self.list_display: # ['title', 'prcie',edit,delete]
if isinstance(field,str):
val=getattr(obj,field)
else:
val=field(self,obj) temp.append(val) new_data_list.append(temp) '''
new_data_list=[
["北京折叠",122,<a href=''>编辑</a>,<a href=''>删除</a>],
["三体", 222,<a href=''>编辑</a>,<a href=''>删除</a>],
]
''' return render(request, 'list_view.html', {"new_data_list": new_data_list,"model_name":model_name,"header_list":header_list}) def add_view(self, request):
return render(request, 'add_view.html') def change_view(self, request, id):
return render(request, 'change_view.html') def delete_view(self, request, id):
return render(request, 'delete_view.html') def get_urls2(self):
temp = [] temp.append(url(r"^$", self.list_view))
temp.append(url(r"^add/$", self.add_view))
temp.append(url(r"^(\d+)/change/$", self.change_view))
temp.append(url(r"^(\d+)/delete/$", self.delete_view)) return temp @property
def urls2(self):
return self.get_urls2(), None, None class XadminSite(object): def __init__(self, name='admin'):
self._registry = {} def get_urls(self): print(self._registry) # {Book:modelAdmin(Book),.......} temp = []
for model, admin_class_obj in self._registry.items():
# 获取当前循环的model的字符串与所在app的字符串
app_name = model._meta.app_label # "app01"
model_name = model._meta.model_name # "book" temp.append(url(r'^{0}/{1}/'.format(app_name, model_name),admin_class_obj.urls2), ) '''
url(r"app01/book",ModelXadmin(Book,site).urls2)
url(r"app01/publish",ModelXadmin(Publish,site).urls2)
url(r"app02/order",ModelXadmin(Order,site).urls2) '''
return temp @property
def urls(self):
return self.get_urls(),None,None def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelXadmin self._registry[model] = admin_class(model, self) # {Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)} site=XadminSite()
10.10xadmin的更多相关文章
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...
- Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作
Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...
- ArcGIS 10.0紧凑型切片读写方法
首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...
- CI Weekly #10 | 2017 DevOps 趋势预测
2016 年的最后几个工作日,我们对 flow.ci Android & iOS 项目做了一些优化与修复: iOS 镜像 cocoapods 版本更新: fir iOS上传插件时间问题修复: ...
- 10个最好用的HTML/CSS 工具、插件和资料库
大家在使用HTML/CSS开发项目的过程中,有使用过哪些工具,插件和库?下面介绍的10种HTML/CSS工具,插件和资料库,是国外程序员经常用到的. Firebug Lite FirebugLite ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误
1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8 在安装的时候报错: -1ubu1604-amd64.deb 提示: ...
- Ubuntu 16.10 安装byzanz截取动态效果图工具
1.了解byzanz截取动态效果图工具 byzanz能制作文件小,清晰的GIF动态效果图,不足就是,目前只能通过输入命令方式来录制. byzanz主要的参数选项有: -d, --duration=SE ...
- Ubuntu 16.10 安装KolourPaint 4画图工具
KolourPaint 4画图工具简单实用,可以绘画.视频处理和图标编辑: • 绘画:绘制图表和“手绘” • 视频处理:编辑截图和照片;应用特效 • 图标编辑:绘画剪贴和标识透明化 1.在Ubuntu ...
随机推荐
- UVA11137 Ingenuous Cubrency 完全背包 递推式子
做数论都做傻了,这道题目 有推荐,当时的分类放在了递推里面,然后我就不停的去推啊推啊,后来推出来了,可是小一点的数 输出答案都没问题,大一点的数 输出答案就是错的,实在是不知道为什么,后来又不停的看, ...
- linux网络设备—mdio总线
一.结构体 struct mii_bus { const char *name; //总线名 char id[MII_BUS_ID_SIZE]; //id void *priv; //私有数据 int ...
- vmware vSphere 5.5的14个新功能
摘录自:http://www.networkworld.com/slideshow/117304/12-terrific-new-updates-in-vmware-vsphere-55.html#s ...
- 添加JavaDoc
使用javadoc比较容易生成文档,命令如下: javadoc -d doc -sourcepath src/main/java/ -subpackages com -encoding UTF-8 - ...
- (98)Address already in use: make_sock: could not bind to address 80 [resolved] (2012-10-11 09:04)
以前遇到一个问题: sudo /etc/init.d/apache2 start * Starting web server apache2 apache2: Could not reliably d ...
- ceph 对象存储跨机房容灾
场景分析 每个机房的Ceph都是独立的cluster,彼此之间没有任何关系. 多个机房都独立的提供对象存储功能,每个Ceph Radosgw都有自己独立的命名空间和存储空间. 这样带来两个问题: 针对 ...
- KeyTool 和 OpenSSL 相互转换 [转]
REM 生成自签名 CA 证书 REM Win32 OpenSSL REM http://slproweb.com/products/Win32OpenSSL.html REM How to crea ...
- LeetCode OJ 238. Product of Array Except Self 解题报告
题目链接:https://leetcode.com/problems/product-of-array-except-self/ 238. Product of Array Except Se ...
- linux删除软连接
#mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即可) 下面我们来创建tes ...
- 游戏编程精粹学习 - 使用Bloom过滤来提高计算性能(BloomFilter)
原文在<游戏编程精粹2>的1.2中,BloomFilter是一种可以快速检测是否存在集合包含关系的数据结构,但有一定的误识别率. 该结构的优点 判断包含关系时效率较高,粗略测试了下比Lis ...