乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

    • 基础知识

    • Django框架

      • Django之框架
      • Django之ORM详解
      • Django之操作ORM
      • Django之操作ORM例子
      • Django之路由系统
      • Django之跨站请求伪造
      • Django之Cookie和Session
      • Django之CBV和FBV
      • Django之中间件
      • Django之用户认证系统
      • Django之Form组件
      • Django之Ajax
      • Django之模板语言
      • Django之URL分发
      • Django中的缓存
      • Models迁移原理
      • 自定义组件Xadmin
      • Markdown 富文本插件
      • 手写一个验证码
    • 其他

  • DevOps

  • 专栏
  • Python
  • Django框架
乔克
2025-07-19

自定义组件Xadmin

步骤如下:

  1. 启动时自动发现
  2. 注册
  3. 设计 url

启动:

1、创建 Django 项目,创建两个 app(app01 和 Xadmin),其中 Xadmin 作为一个组件;

2、在 app01 的应用中创建新的 Xadmin.py 文件

3、在 settings.py 中添加应用

INSTALLED_APPS = [
    ...
    'Xadmin.apps.XadminConfig',
    'app01.apps.App01Config',
]
1
2
3
4
5

4、配置 Xadmin 应用中的 apps.py 文件

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules


class XadminConfig(AppConfig):
    name = 'Xadmin'

    def ready(self):
        autodiscover_modules('Xadmin')
1
2
3
4
5
6
7
8
9

注册:

5、在 Xadmin 项目中新增一个 package dir,在里面新增一个 Xadmin.py 文件,如下:

58ddaff8be9b93db3844c0a48ad8ce91 MD5

6、在 Xadmin.py 中新增一个类,类的内容如下:

class ModelXadmin(object):
    def __init__(self, model, site):
        self.model = model
        self.site = site


class XadminSite(object):
    def __init__(self):
        self._registry = {}

    def registry(self, model, admin_class=None, **options):
        if not admin_class:
            admin_class = ModelXadmin
        self._registry[model] = admin_class(model, self)


# 单例模式
site = XadminSite()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

7、在 app01 应用中的 Xadmin.py 文件中注册我们的 Model

from Xadmin.service import Xadmin
from app01 import models


Xadmin.site.registry(models.UserInfo)
Xadmin.site.register(models.Article)
Xadmin.site.register(models.Article2Tag)
Xadmin.site.register(models.ArticleDetail)
Xadmin.site.register(models.ArticleUpDown)
Xadmin.site.register(models.Blog)
Xadmin.site.register(models.Category)
Xadmin.site.register(models.Comment)
Xadmin.site.register(models.Tag)
1
2
3
4
5
6
7
8
9
10
11
12
13

设计 URL:

8、在主工程的 urls.py 文件中配置如下:

from django.conf.urls import url
from django.contrib import admin
from Xadmin.service import Xadmin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^Xadmin/', Xadmin.site.urls),
]
1
2
3
4
5
6
7
8

9、在 Xadmin 组件中的 Xadmin.py 文件中的代码如下:

from django.conf.urls import url
from django.shortcuts import HttpResponse


class ModelXadmin(object):
    def __init__(self, model, site):
        self.model = model
        self.site = site


class XadminSite(object):
    def __init__(self):
        self._registry = {}

    def register(self, model, admin_class=None, **options):
        if not admin_class:
            admin_class = ModelXadmin
        self._registry[model] = admin_class(model, self)

    def list_view(self, request):
        return HttpResponse("list_view")

    def delete_view(self,request, id):
        return HttpResponse("delete_view")

    def add_view(self,request):
        return HttpResponse("add_view")

    def change_view(self,request, id):
        return HttpResponse("change_view")

    def get_operate_urls(self):
        """
            分发操作的urls
            :return:
        """
        operate_urls_list = [url(r'^$', self.list_view), url(r'^add/$', self.add_view),
                             url(r'^(\d+)/change/$', self.change_view), url(r'^(\d+)/delete/$', self.delete_view)]
        return operate_urls_list

    @property
    def urls2(self):
        return self.get_operate_urls(), None, None

    def get_urls(self):
        urlpatterns = []
        for model, admin_class_obj in self._registry.items():
            app_name = model._meta.app_label
            model_name = model._meta.model_name
            urlpatterns.append(url(r'^{0}/{1}/'.format(app_name, model_name), self.urls2))
        return urlpatterns

    @property
    def urls(self):
        return self.get_urls(), None, None


# 单例模式
site = XadminSite()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

然后启动服务便可通过类似如下 URL 进行访问:

127.0.0.1:8000/Xadmin/app01/book/

127.0.0.1:8000/Xadmin/app01/book/add/

127.0.0.1:8000/Xadmin/app01/book/1/change/
127.0.0.1:8000/Xadmin/app01/book/1/delete/

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 11:33:23
Models迁移原理
Markdown 富文本插件

← Models迁移原理 Markdown 富文本插件→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式