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 ...
随机推荐
- H3C 根据子网掩码计算子网数
- 【t056】智力问答(链表+计数排序做法)
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 新年联欢会上,G.Sha负责组织智力问答节目.G.Sha建立了一个很大很大的超级题库,并衡量了每道题的 ...
- 用es5实现模板字符串
废话不多说,主要是利用正则表达式replace+eval动态取值(纯属娱乐) String.prototype.myReplace = function(){ return this.replace( ...
- apache WEB服务器安装(包括虚拟主机)
一.apache下载编译安装 yum install apr apr-devel apr-util apr-util-devel gcc-c++ wget tar -y cd /usr/src wge ...
- python简单小程序
#足球队寻找10 到12岁的小女孩(包含10岁和12岁),编写程序询问用户性别和年龄,然后显示一条消息指出这个人是否可以加入球队,询问10次,输出满足条件的总人数#询问10次,输出满足要求的总人数 o ...
- C语言中的优先级和类型转换分析
一.优先级 1.易错的优先级 二.类型转换 在C语言中,存在强制类型装换,也存在隐式类型转换,隐式类型转换实际上属于强制类型转换,隐式类型转换要点如图. (1)举例:算术运算式中,低类型转换为高类型 ...
- Python网络编程笔记一
AF_INET:IPV4 AF_INET6:IPV6 套接字类型: SOCK_STREAM:TCP SOCK_DGRAM:UDP 创建TCP套接字,也可以不传递参数,默认创建TCP套接字 tcpSoc ...
- 0001 认识WEB( 标准)
认识WEB 1. 认识网页 网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频以及Flash等. 思考: 网页是如何形成的呢? 总结 网页有图片.链接.文字等元素组 ...
- ELK学习实验003:Elasticsearch 集群安装
前面已经介绍了Elasticsearch这个工具,并对单机安装做了简单介绍,现在使用三台机器做一个elasticsearch集群 一 环境准备 1.1 机器准备 1.2 同步时间 [root@node ...
- C# ref参数
ref关键字用于将方法内的变量改变后带出方法外.具体我们通过例子来说明: static void Main(string[] args) { int c = 0; Add(1, 2,ref c); C ...