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 ...
随机推荐
- vue项目上滑滚动加载更多&下拉刷新
上滑滚动时获取内容高度.屏幕高度和滚动高度(此处#sslist要为内容是id) 内容高度 let innerHeight = document.querySelector("#sslist ...
- js操作改变原数组的解决方法
最近在开发的时候发现js中的循环操作会改变原数组,var一个变量承接也不行 甚至连map方法都会改变原数组,下面是解决方法 let a = ['a','b','c'] let b = [[2, 0, ...
- Linux 内核 设备结构嵌入
设备结构包含设备模型核心需要的来模型化系统的信息. 大部分子系统, 但是, 跟踪关于 它们驻留的设备的额外信息. 结果, 对设备很少由空设备结构所代表; 相反, 这个结构, 如同 kobject 结构 ...
- css隐藏滚动条、移动端滚动卡顿的解决
1.如果想保持容器能够滚动,同时不想看到丑陋的滚动条,chrome.firefox和移动端上不考虑兼容性直接 element::-webkit-scrollbar{ display:none } 2. ...
- VisualStudio 断点调试详解
本文详细告诉大家 VisualStudio 断点调试的功能和使用方法,本文使用的是最新 VisualStudio2019 的功能,也许在你看到这篇博客的时候这个版本已经过时 本文将会按照从简单到复杂, ...
- android权限申请执行过程
弹出的授权对口窗口实际上是一个activity(隐式intent启动上图第二个方块里)(com.android.packageinstaller.permission.ui.Grantpermissi ...
- 2017.5.11 昨天晚上看fview直播坚果pro回放
对话1 彭林: 我以前也是产品经理,身为产品经理,你有没有感觉我们做出过什么之前不被人接受的东西,但是我们却坚持做了,并且得到的反响非常好. 朱萧木: 没有吧,我们没有做颠覆用户认知或者三观的特别 ...
- python 练习题2
# 习题1:# 设定一个用户名和密码,用户输入正确的用户名和密码,# 则显示登录成功,否则提示登录失败,用户最多失败3次,# 否则退出程序.username="test"passw ...
- Memcahced 缓存过期时间问题
转载:https://help.aliyun.com/knowledge_detail/38654.html 关于设置缓存数据的过期时间,可以参考以下Memcached官方说明: An expirat ...
- 16.python内置函数
Python 内置函数:https://www.runoob.com/python/python-built-in-functions.html 原文:https://www.cnblogs.com/ ...