Xadmin的实现
一、启动
1、前提
配置setting.py文件 INSTALLED_APPS
2、定位Xadmin,找到对应的类
'Xadmin.apps.XadminConfig',
3、根据admin源码,实现启动
from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules class XadminConfig(AppConfig):
name = 'Xadmin' # 启动Xadmin
def ready(self):
autodiscover_modules('Xadmin')
二、注册
1、根据需求,需要自定义 注册的对象和方法
根据admin源码
# 定义ModelXadmin, models的样式
class ModelXadmin: def __init__(self, model, site):
self.model = model
self.site = site # 定义 XadminSite类
class XadminSite: def __init__(self, name='Xadmin'):
self._registry = {} def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelXadmin
self._registry[model] = admin_class(model, self) site = XadminSite()
2、注册
from Xadmin.service.Xadmin import site
from app01.models import Book, Publish, Author, AuthorDetail # Register your models here. site.register(Book)
site.register(Publish)
site.register(Author)
site.register(AuthorDetail)
三、设置url
1、设置url
from django.contrib import admin
from Xadmin.service.Xadmin import site
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('Xadmin/', site.urls),
]
2、分发url
from django.urls import path
from django.shortcuts import HttpResponse # 定义ModelXadmin, models的样式
class ModelXadmin: def __init__(self, model, site):
self.model = model
self.site = site # 定义 XadminSite类
class XadminSite: def list_view(self, request):
print(request.path)
return HttpResponse("list_view") def add_view(self, request):
print(request.path)
return HttpResponse("add_view") def change_view(self, request, id):
print(request.path)
return HttpResponse("change_view") def delete_view(self, request, id):
print(request.path)
return HttpResponse("delete_view") def __init__(self, name='Xadmin'):
self._registry = {} def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelXadmin
self._registry[model] = admin_class(model, self) # 一级urls
def get_urls(self):
temp = []
for models, admin_class_obj in self._registry.items():
app_name = models._meta.app_label
models_name = models._meta.model_name
temp.append(path('%s/%s/' % (app_name, models_name), self.urls2)),
return temp # 二级urls
def get_urls2(self):
temp = []
temp.append(path('', self.list_view))
temp.append(path('add/', self.add_view))
temp.append(path('<id>/change/', self.change_view))
temp.append(path('<id>/delete/', self.delete_view))
return temp @property
def urls(self):
return self.get_urls(), None, None @property
def urls2(self):
return self.get_urls2(), None, None site = XadminSite()
3、将有关样式的分发迁移到样式类中
from django.urls import path
from django.shortcuts import HttpResponse, render # 定义ModelXadmin, models的样式
class ModelXadmin: def __init__(self, model, site):
self.model = model
self.site = site def list_view(self, request):
print(request.path) # /Xadmin/app02/food/
print(self.model) # <class 'app02.models.Food'>
data_list = self.model.objects.all()
# return HttpResponse("list_view")
return render(request, "show_food.html", {"data_list": data_list}) def add_view(self, request):
print(request.path)
return HttpResponse("add_view") def change_view(self, request, id):
print(request.path)
return HttpResponse("change_view") def delete_view(self, request, id):
print(request.path)
return HttpResponse("delete_view") # 二级urls
def get_urls(self):
temp = []
temp.append(path('', self.list_view))
temp.append(path('add/', self.add_view))
temp.append(path('<id>/change/', self.change_view))
temp.append(path('<id>/delete/', self.delete_view))
return temp @property
def urls(self):
return self.get_urls(), None, None # 定义 XadminSite类
class XadminSite: def __init__(self, name='Xadmin'):
self._registry = {} def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelXadmin
self._registry[model] = admin_class(model, self) # 一级urls
def get_urls(self):
temp = []
# admin_class_obj 是 ModelXadmin的对象
for models, admin_class_obj in self._registry.items():
app_name = models._meta.app_label
models_name = models._meta.model_name
temp.append(path('%s/%s/' % (app_name, models_name), admin_class_obj.urls)),
return temp @property
def urls(self):
return self.get_urls(), None, None site = XadminSite()
优点
1、每一个表对应不同的模板
2、在样式类中方便调用表的数据
self.models # <class 'app02.models.Food'>
models.Food
Xadmin的实现的更多相关文章
- 关于django xadmin的学习改造(菜单名称,更改默认前缀数据库)
路径xadmin-master\demo_app\app\models.py class c(models.Model): ip_address = models.CharField(max_leng ...
- xadmin 自定义视图在uwsgi部署时的一坑
比如修改登录页的template,代码如下: xadmin.site.register(xadmin.views.LoginView, login_template="card_pool/s ...
- django xadmin 外键
style_fields = {'db栏位名称': "fk-ajax"} 实体关系: Account (*)-->(1) user 表单控件: 下拉框 美化用了selecti ...
- django xadmin 插件(3) 列表视图新增自定义按钮
效果图: 编辑按钮是默认的list_editable属性对应的插件(xadmin.plugins.editable) 放大按钮对应的是自定义插件. 自定义按钮源码: xplugin.py(保证能够直接 ...
- django xadmin 插件(2) 列表视图新增一功能列
以默认的related_link为例(即最后一列). 源码:xadmin.plugins.relate.RelatedMenuPlugin class RelateMenuPlugin(BaseAdm ...
- django xadmin 插件(1)
1. 插件的作用可以是全局的,也可以是只针对某个模型的.通过其 init_request控制是否加载此插件, demo如下: class SCPCardOverviewPlugin(BaseAdmin ...
- django xadmin自定义菜单
1. 自定义菜单 adminx.py class GlobalSetting(object): site_title = u'xxx后台' def kuF_site_menu(self): retur ...
- django xadmin多个model的数据渲染在统一个template中
adminx.py demo class ModelAdmin(object): #.... def get_context(self): context = super(SimCardService ...
- django xadmin 模板的定制
编辑新增等页面对应的modelform为ModelFormAdminView (xadmin.views.edit.ModelFormAdminView) 通过源码分析,新增对象的template属性 ...
- Django1.9开发博客(14)- 集成Xadmin
xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 B ...
随机推荐
- linux 手动睡眠
在 Linux 内核的之前的版本, 正式的睡眠要求程序员手动处理所有上面的步骤. 它是一 个繁琐的过程, 包含相当多的易出错的样板式的代码. 程序员如果愿意还是可能用那种方 式手动睡眠; <li ...
- CSS 手札记
Display:Block/Flex 宽度如果不定义会尽可能的扩充外层宽度 在内容区域使用高度百分比和固定像素高度的时候外层设overflow:auto;可以把内层的高度撑开,否则外层会比内层短一截 ...
- 为何D3D11的几个矩阵需要转置?
在学习D3D11的时候遇到一个问题,事情是这样的: D3D11引入了常量缓存(const buffer)用来实现数据的高速传输,这块儿buffer是CPU Only Write,GPU Only Re ...
- 一目了然 | 数据库实例性能调优利器:Performance Insights
Performance Insights是什么 阿里云RDS Performance Insights是RDS CloudDBA产品一项专注于用户数据库实例性能调优.负载监控和关联分析的利器,以简单直 ...
- Cmder安装与使用
越来越多人使用Cmder代替Windows的cmd(毕竟其界面太Lower了),但是每次用Cmder都要回到安装目录查找之后才能使用,真的很麻烦,有木有可以像Git一样右键就是可以用的方法呢?答案当然 ...
- POJ 3111 K Best 最大化平均值 [二分]
1.题意:给一共N个物品,每个物品有重量W,价值V,要你选出K个出来,使得他们的平均单位重量的价值最高 2.分析:题意为最大化平均值问题,由于每个物品的重量不同所以无法直接按单位价值贪心,但是目标值有 ...
- HDU 2068 RPG错排 [错排公式]
1.题意:1到N的序列的排列中,元素位置与元素值相对应的情况(值为i的元素在某个排列中正好排在第i个位置)大于等于序列规模一半的情况,有多少个? 2.输入输出:每组数据一个数,N,规定输入以0结尾: ...
- Vue+Element实现网页版个人简历系统
这篇文章介绍一个使用Vue+Element实现的个人简历系统,主要用到的技术有:vue.element.css3.css定位. 作者在window10进行开发,目前只在chrome上进行过测试,没有大 ...
- TCP/IP||ARP/RARP
1.ARP ARP(地址解析协议)主要为IP地址到对应的硬件提供动态映射,过程是自动完成 在网络接口有一个硬件地址(48 bit),在硬件层次上的数据帧交换必须有正确的接口地址,但是32 bit 的I ...
- Kafka学习笔记4--Kafka消费者的客户端(PHP)开发
一.准备工作 虽然 Kafka 是用 Java/Scala 语言编写的,但这不妨碍它对多语言的支持.可以在 Kafka 官网的 CLIENTS 查看 Kafka 支持的语言,其中包括 C/C++.Py ...