一、启动

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的实现的更多相关文章

  1. 关于django xadmin的学习改造(菜单名称,更改默认前缀数据库)

    路径xadmin-master\demo_app\app\models.py class c(models.Model): ip_address = models.CharField(max_leng ...

  2. xadmin 自定义视图在uwsgi部署时的一坑

    比如修改登录页的template,代码如下: xadmin.site.register(xadmin.views.LoginView, login_template="card_pool/s ...

  3. django xadmin 外键

    style_fields = {'db栏位名称': "fk-ajax"} 实体关系: Account (*)-->(1) user 表单控件: 下拉框 美化用了selecti ...

  4. django xadmin 插件(3) 列表视图新增自定义按钮

    效果图: 编辑按钮是默认的list_editable属性对应的插件(xadmin.plugins.editable) 放大按钮对应的是自定义插件. 自定义按钮源码: xplugin.py(保证能够直接 ...

  5. django xadmin 插件(2) 列表视图新增一功能列

    以默认的related_link为例(即最后一列). 源码:xadmin.plugins.relate.RelatedMenuPlugin class RelateMenuPlugin(BaseAdm ...

  6. django xadmin 插件(1)

    1. 插件的作用可以是全局的,也可以是只针对某个模型的.通过其 init_request控制是否加载此插件, demo如下: class SCPCardOverviewPlugin(BaseAdmin ...

  7. django xadmin自定义菜单

    1. 自定义菜单 adminx.py class GlobalSetting(object): site_title = u'xxx后台' def kuF_site_menu(self): retur ...

  8. django xadmin多个model的数据渲染在统一个template中

    adminx.py demo class ModelAdmin(object): #.... def get_context(self): context = super(SimCardService ...

  9. django xadmin 模板的定制

    编辑新增等页面对应的modelform为ModelFormAdminView (xadmin.views.edit.ModelFormAdminView) 通过源码分析,新增对象的template属性 ...

  10. Django1.9开发博客(14)- 集成Xadmin

    xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 B ...

随机推荐

  1. vue项目上滑滚动加载更多&下拉刷新

    上滑滚动时获取内容高度.屏幕高度和滚动高度(此处#sslist要为内容是id) 内容高度  let innerHeight = document.querySelector("#sslist ...

  2. js操作改变原数组的解决方法

    最近在开发的时候发现js中的循环操作会改变原数组,var一个变量承接也不行 甚至连map方法都会改变原数组,下面是解决方法 let a = ['a','b','c'] let b = [[2, 0, ...

  3. Linux 内核 设备结构嵌入

    设备结构包含设备模型核心需要的来模型化系统的信息. 大部分子系统, 但是, 跟踪关于 它们驻留的设备的额外信息. 结果, 对设备很少由空设备结构所代表; 相反, 这个结构, 如同 kobject 结构 ...

  4. css隐藏滚动条、移动端滚动卡顿的解决

    1.如果想保持容器能够滚动,同时不想看到丑陋的滚动条,chrome.firefox和移动端上不考虑兼容性直接 element::-webkit-scrollbar{ display:none } 2. ...

  5. VisualStudio 断点调试详解

    本文详细告诉大家 VisualStudio 断点调试的功能和使用方法,本文使用的是最新 VisualStudio2019 的功能,也许在你看到这篇博客的时候这个版本已经过时 本文将会按照从简单到复杂, ...

  6. android权限申请执行过程

    弹出的授权对口窗口实际上是一个activity(隐式intent启动上图第二个方块里)(com.android.packageinstaller.permission.ui.Grantpermissi ...

  7. 2017.5.11 昨天晚上看fview直播坚果pro回放

      对话1 彭林: 我以前也是产品经理,身为产品经理,你有没有感觉我们做出过什么之前不被人接受的东西,但是我们却坚持做了,并且得到的反响非常好. 朱萧木: 没有吧,我们没有做颠覆用户认知或者三观的特别 ...

  8. python 练习题2

    # 习题1:# 设定一个用户名和密码,用户输入正确的用户名和密码,# 则显示登录成功,否则提示登录失败,用户最多失败3次,# 否则退出程序.username="test"passw ...

  9. Memcahced 缓存过期时间问题

    转载:https://help.aliyun.com/knowledge_detail/38654.html 关于设置缓存数据的过期时间,可以参考以下Memcached官方说明: An expirat ...

  10. 16.python内置函数

    Python 内置函数:https://www.runoob.com/python/python-built-in-functions.html 原文:https://www.cnblogs.com/ ...