自定义admin

概要:django-admin本质就是一个app,只是Django内部分装了,因此我们尝试自己设计一个简易版的admin

设计前知识补充:

model._meta.app_label:获该类所在的app名

model._meta.model_name:获该类的类名

model:类

config_obj:配置类对象对象

设计思路

1 在uls.py文件中,模仿admin  url(r'^admin/', admin.site.urls)

  我们可以设计一个名为stark的app,

2 创建stark模块,基础配置按app方法来,其中创建一个servers文件,写我们自己的模块

3 按照admin源码解析的思路:启动--->注册----->url设计

4 启动:

  1 扫描 ---{扫描所有app下的stark文件}

    这里有个ready函数,在启动时执行,我们利用这个函数完成扫描功能

    在apps.py下  

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules class StarkConfig(AppConfig):
name = 'stark'
def ready(self):
autodiscover_modules('stark')

注册 

 目的:将所有的模型类,及模型类对象,以键值对的形式保存在site._registry

 这里需要一个单例模式的对象site,及默认模型类

 在stark下的servers文件下的sites文件进行设计  

# 默认模型类
class ModelStark: pass # 单例site模型类
class StarkSite(object): def __init__(self):
self._registry = {} def register(self ,model ,admin_class=None):
if not admin_class:
admin_class = ModelStark
self._registry[model] = admin_class(model) site = StarkSite()

 然后在app下的stark文件下进行注册

from stark.servers import sites
from app01.models import Author, Book, Publish, AuthorDetail sites.site.register(Author)
class BookConfig(sites.ModelStark):
list_display = ['title','price']
sites.site.register(Book,BookConfig)
sites.site.register(Publish)
sites.site.register(AuthorDetail)

 如果我们需要自定义模型

  按照admin的方式来就行了,只不过继承的是我们定义的默认模型类

url设计

  参考多级路由:

  难点:三级路由

   url_list = url(r'{}/{}/'.format(model._meta.app_label,model._meta.model_name),config_obj.urls)

   解析:config_obj:配置类对象对象,我们在配置类对象中设计三级路由,及所对应的视图函数

      优点:我们可以从视图函数中直接取到配置类的对象,由于 self.model = model 我们还可以取到对应的表

  实际操作:

  urls.py中  

urlpatterns = [
url(r'^admin/', admin.site.urls),
#
# url(r'index',([
# url(r'^$',index),
# url(r'test01',test01),
# url(r'test02',test02)
# ],None,None))
url(r'^stark/', sites.site.urls)
]

  自定义的sites.py中

  

from django.conf.urls import url
from django.shortcuts import render, HttpResponse, redirect class ModelStark:
list_display = []
def __init__(self,model):
self.model = model
def show(self,request):
print('>>>>>>>',self.model,self.list_display)
show_obj = self.model.objects.all()
return render(request,'show.html',{'show_obj':show_obj})
def add(self,request):
add_obj = self.model.objects.all()
return render(request,'add.html',{'add_obj':add_obj})
def change(self,request,id):
change_obj = self.model.objects.all()
return render(request,'change.html',{'change_obj':change_obj})
def delete(self,request,id):
delete_obj = self.model.objects.all()
return render(request,'delete.html',{'delete_obj':delete_obj})
def get_urls(self):
item = [
url(r'^$',self.show),
url(r'add/',self.add),
url(r'(\d+)/change/', self.add),
url(r'(\d+)/delete', self.delete),
]
return item
@property
def urls(self):
return self.get_urls(),None,None
class AdminSite(object): def __init__(self):
self._registry = {} def register(self ,model ,admin_class=None):
if not admin_class:
admin_class = ModelStark
self._registry[model] = admin_class(model)
def get_urls(self):
item = []
for model, config_obj in self._registry.items():
url_list = url(r'{}/{}/'.format(model._meta.app_label,model._meta.model_name),config_obj.urls)
item.append(url_list)
print('--->',item)
return item @property
def urls(self):
# print('----000--->',self._registry)
return self.get_urls(), None, None
site = AdminSite()

  

bbs-admin-自定义admin(一)的更多相关文章

  1. Django 中自定义 Admin 样式与功能

    目录 自定义 Admin 样式与功能 1 页面修改中文 1.1 语言设置为中文 1.2 应用管理设置为中文 1.3 数据库表设置为中文 1.4 数据库表字段名称修改为中文 2 修改后台样式 2.1 安 ...

  2. Part 7:自定义admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  3. 自定义admin(self_admin)

    admin.site.register(models.UserInfo)admin.site.register(models.Book,Book_admin)######当下面注册的这个表里面没有这个 ...

  4. django admin自定义

    django admin自定义 class CustomerAdmin(admin.ModelAdmin): list_display = ('id','name','qq','consultant' ...

  5. 自定义admin管理工具(stark组件)

    自定义admin管理工具(stark组件) 创建项目 了解了admin的功能后,我们可以开始仿照admin编写我们自己的管理工具stark组件 首先创建一个新的项目,并创建三个app stark就是我 ...

  6. 自定义admin

    平时我们用的django自带admin,怎么评价呢?一个字简陋,而且也人性化,如下图,首先只显示数据对象,如果要查看详细还有点进去,其次不能对自己想要的数据进行刷选 我们的期望是:数据如excel显示 ...

  7. 模拟Django的admin自定义stark组件

    1.新建Django项目--新建app:app01和stark--在settings中配置app和数据库--在models.py中新建模型表--完成数据库迁移 2.在stark下的apps.py中: ...

  8. 第一个Django应用 - 第七部分:自定义admin

    Django的admin站点是自动生成的.高度可定制的,它是Django相较其它Web框架独有的内容,广受欢迎.如果你觉得它不够美观,还有第三方美化版xadmin.请一定不要忽略它,相信我,它值得拥有 ...

  9. Django之model admin自定义后台管理

    Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 比如,数据表如下: from django.db ...

  10. ERRORS:<class 'Salesman.admin.UsrMngUserAdmin'>: (admin.E005) Both 'fieldsets' and 'fields' are specified.

    在使用django admin的过程中 遇到了这个错误 . Both 'fieldsets' and 'fields' are specified. django.core.management.ba ...

随机推荐

  1. 护卫神等IIS设置Thinkphp框架的public目录为根目录的解决办法

    最近碰到一个棘手的问题,在使用护卫神或者主机宝等IIS环境配置PHP的时候,不能把public设置为网站根目录(因为Thinkphp的安全要求:要将public设置为对外公开目录),这个问题无法搜索到 ...

  2. composer在windows下安装并且设置全局变量

    Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 1丶使用安 ...

  3. 【广搜】Keyboarding

    题目描述 给定一个r行c列的在电视上的“虚拟键盘”,通过“上,下,左,右,选择”共5个控制键,你可以移动电视屏幕上的光标来打印文本.一开始,光标在键盘的左上角,每次按方向键,光标总是跳到下一个在该方向 ...

  4. css样式背景图片设置缩放

    一.背景颜色图片平铺 background-color 背景颜色 background-image 背景图片地址 background-repeat 是否平铺 默认是平铺 background-pos ...

  5. 使用LEANGOO泳道

    转自:https://www.leangoo.com/leangoo_guide/leangoo_yongdao.html 列表使用纵向的纬度管理卡片,通常代表卡片的工作的不同阶段,或者任务的状态.泳 ...

  6. PyInstaller使用教程

    简介 PyInstaller是一个第三方库,它能够在Windows.Linux. Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Py ...

  7. 如何解决Bat脚本中包含中文,运行乱码

    bat文件右键用“ 编辑”  打开, 另存为时,UTF-8保存为ANSI 格式.即可解决运行是乱码问题, 有notepad++更好 修改直接保存,也不用另存为.

  8. 使用canvas 代码画小猪佩奇

    最近不是小猪佩奇很火嘛!!! 前几天 在知乎 看见了别人大佬用python写的 小猪佩奇,  顿时想学 ,可是 自己 没学过python(自己就好爬爬图片,,,,几个月没用 又丢了) 然后 就想画一个 ...

  9. python基础:数据类型一

    一.可变不可变类型 二.数字类型 三.字符串类型 四.列表类型 一.可变不可变类型 #可变类型: 值变了,但是id没有变,证明没有生成新的值而是在改变原值,原值是可变类型 #不可变类型:值变了,id也 ...

  10. idou老师教你学Istio 04:Istio性能及扩展性介绍

    Istio的性能问题一直是国内外相关厂商关注的重点,Istio对于数据面应用请求时延的影响更是备受关注,而以现在Istio官方与相关厂商的性能测试结果来看,四位数的qps显然远远不能满足应用于生产的要 ...