看完前一篇,相信你对Django中admin组件有了一定的了解,下面就一起来设计一个自己的admin组件,Xadmin

Xadmin初始化

首先,在一个django项目中新建两个app,一个用于测试Xadmin(testXadmin),一个书写Xadmin组件(Xadmin),然后将两个app都注册到setting文件中:

然后在template文件夹中设置四个网页页面:

add_view.html

change_view.html

delete_view.html

list_view.html

以一个页面为例,做一个简单的示范:add_view.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>查看</h3>
</body>
</html>

步骤一 书写注册语句

注册语句为:

在Xadmin.apps.py中添加如下代码:

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modulesclass XadminConfig(AppConfig):name = 'Xadmin'def ready(self):  # 加载类的时候会自动加载autodiscover_modules("Xadmin")

步骤二 书写site单例对象,渲染基类对象

在一个利于导入的地方写下生成site的url生成对象,和渲染基类对象,例如我在Xadmin  APP下新建一个server文件夹,server中新建Xadmin.py文件

Xadmin.py:

from django.conf.urls import url
from django.shortcuts import HttpResponse, render, redirectclass ModelXadmin(object):def __init__(self, model, site):self.model = modelself.site = sitedef list_view(self, request):print("self.model", self.model)data_list = self.model.objects.all()print("data_list", data_list)return render(request, 'list_view.html', {"data_list": data_list})def add_view(self, request):return render(request, 'add_view.html')def change_view(self, request, id):return render(request, 'change_view.html')def delete_view(self, request, id):return render(request, 'delete_view.html')def get_urls2(self):temp = []temp.append(url(r"^$", self.list_view))temp.append(url(r"^add/$", self.add_view))temp.append(url(r"^(\d+)/change/$", self.change_view))temp.append(url(r"^(\d+)/delete/$", self.delete_view))return temp@propertydef urls2(self):return self.get_urls2(), None, Noneclass XadminSite(object):"""url分配,生成对象"""def __init__(self, name='admin'):self._registry = {}def get_urls(self):print(self._registry)  # {Book:modelAdmin(Book),.......}temp = []for model, admin_class_obj in self._registry.items():app_name = model._meta.app_labelmodel_name = model._meta.model_nametemp.append(url(r'^{0}/{1}/'.format(app_name, model_name), admin_class_obj.urls2), )'''url(r"app01/book",ModelXadmin(Book,site).urls2)url(r"app01/publish",ModelXadmin(Publish,site).urls2)url(r"app02/order",ModelXadmin(Order,site).urls2)'''return temp@propertydef urls(self):return self.get_urls(), None, None  # 返回的是一个元组,元组第一个参数是列表def register(self, model, admin_class=None, **options):if not admin_class:admin_class = ModelXadminself._registry[model] = admin_class(model, self)  # {Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)}site = XadminSite()

  这里生成的site对象就是url中用的site对象

改写url.py文件

将原来admin对应的路径处理函数换成自己Xadmin组件中的site.urls

在测试app中进行测试:

在testXadmin下的models.py文件中书写表关系对应的类:

from django.db import models# Create your models here.class Author(models.Model):nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)age = models.IntegerField()# 与AuthorDetail建立一对一的关系authorDetail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)def __str__(self):return self.nameclass AuthorDetail(models.Model):nid = models.AutoField(primary_key=True)birthday = models.DateField()telephone = models.BigIntegerField()addr = models.CharField(max_length=64)class Publish(models.Model):nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)city = models.CharField(max_length=32)email = models.EmailField()def __str__(self):return self.nameclass Book(models.Model):nid = models.AutoField(primary_key=True)title = models.CharField(max_length=32)publishDate = models.DateField()price = models.DecimalField(max_digits=5, decimal_places=2)# 与Publish建立一对多的关系,外键字段建立在多的一方publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)# 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表authors = models.ManyToManyField(to='Author', )def __str__(self):return self.title

  在testXadmin下新建Xadmin.py文件,文件内容如下:

from Xadmin.service.Xadmin import site, ModelXadmin
from testXadmin.models import *# Register your models here.class BookConfig(ModelXadmin):list_display = ["title", "prcie"]class PublishConfig(ModelXadmin):list_display = ["name"]site.register(Book, BookConfig)
site.register(Publish, PublishConfig)site.register(Author)
site.register(AuthorDetail)

  这样就完成了使用Xadmin组件提换了原来的admin组件,而且在测试app中还进行了测试,下面看测试结果

验证成功,后面编写前端页面即可替代原admin组件

转载于:https://www.cnblogs.com/wlx97e6/p/10110505.html

自定义admin组件,Xamin相关推荐

  1. Python自定义分页组件

    为了防止XSS即跨站脚本攻击,需要加上 safe # 路由 from django.conf.urls import url from django.contrib import admin from ...

  2. Django admin组件源码流程

    admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...

  3. 扩展自定义mq组件,使用rabbitmq_delayed_message_exchange延迟组件,完善消息延迟消息精度问题

    一 引言 最近在项目中发现消息的延迟消费是通过redis的过期消息监听,存在很大的安全问题,由于服务的宕机或其他问题会导致消息的丢失,本想系采用延迟队列和死信队列完成消息的延迟消费,但这种方案存在一定 ...

  4. react ——withRouter——页面隐式传值—嵌套路由——渲染方式——自定义导航组件

    withRouter import {Route,Switch,withRouter} from "react-router-dom" withRouter高阶组件增强组件--获取 ...

  5. django的admin组件使用详解

    一.admin组件介绍 admin作为django的超级用户,权限包括注册目录列表,注册用户权限,注册需要维护的数据库信息等. 二.admin组件的使用 1. 启动项目 访问localhost:800 ...

  6. 【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )

    文章目录 一.Flutter 组件简介 二.Flutter 自定义 StatelessWidget 组件流程 1.导入父类包 2.选择继承的父类 3.设置成员变量及构造函数 4.重写 build 方法 ...

  7. php动态写入vue,Vue自定义动态组件使用详解

    这次给大家带来Vue自定义动态组件使用详解,Vue自定义动态组件的注意事项有哪些,下面就是实战案例,一起来看一下. 现在基于vue的UI组件库有很多,比如iview,element-ui等.但有时候这 ...

  8. 开发自定义JSF组件(4) 保存状态与恢复状态

    2019独角兽企业重金招聘Python工程师标准>>> 完整的教材: 开发自定义JSF组件(1) HelloWorld 开发自定义JSF组件(2) 使用Render渲染器 开发自定义 ...

  9. 【MSDN文摘】使用自定义验证组件库扩展 Windows 窗体: Form Scope

    使用自定义验证组件库扩展 Windows 窗体,第 2 部分(Windows 窗体探索) 发布日期: 5/28/2004 | 更新日期: 5/28/2004 Michael Weinhardt www ...

  10. 为SSIS编写自定义数据流组件(DataFlow Component)之进阶篇:自定义编辑器

    我们之前几篇讨论过自定义数据流组件的一些技术,分别如下 入门篇 http://www.cnblogs.com/chenxizhang/archive/2009/06/20/1507467.html 数 ...

最新文章

  1. Your stream was neither an OLE2 stream, nor an OOXML stream.问题的解决
  2. 双一流高校出新规:研究生未经导师同意发论文,不得用于毕业、评奖!
  3. CAN总线-位时序、波特率、采样点
  4. xml学习4-dtd
  5. 工业交换机的性能优势有哪些?
  6. 高级软件工程2017第2次作业—— 个人项目:四则运算题目生成程序(基于控制台)...
  7. 19楼网站服务器配置,简单的DNS 服务器配置
  8. Gridview光棒效果
  9. ES8新特性_async和await结合使用读取文件内容---JavaScript_ECMAScript_ES6-ES11新特性工作笔记050
  10. 2013总结和2014展望
  11. 【人脸识别】基于matlab PCA+LDA人脸识别【含Matlab源码 680期】
  12. 中播放*.mid格式及其它格式的音乐
  13. 【简单的小技巧】如何从网页上下载内嵌的PDF文件?
  14. 嵌入式linux指纹识别项目,基于嵌入式应用平台的指纹识别系统设计
  15. linux tomcat 验证码无法显示
  16. Windows系统连接蓝牙音箱,已连接,没有声音
  17. mysql属于dbms还是dbs_DB、DBMS和DBS三者之间有什么关系_数据库
  18. Review KD(2)
  19. 浙大版《C语言程序设计实验与习题指导(第3版)》题目集
  20. B1192 [HNOI2006]超级英雄Hero 二分图匹配

热门文章

  1. oracle查询显示小写,oracle查询区分大小写
  2. ❤️Docker教程小白实操入门 教程合集❤️
  3. FISCO BCOS 区块链交易流程 区块
  4. kubernetes视频教程笔记 (32)-安全-准入控制Admission Control
  5. linux ubuntu 查看历史命令
  6. HyperLedger Composer 如何安装、小白入门教程
  7. Hyperledger Fabric的区块结构 交易结构
  8. typeorm 更新_typeORM 多对多关系不同情况的处理
  9. C语言冒泡排序三种写法,冒泡排序的三种实现方法
  10. javscript DOM基础知识(常用篇)