自定义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. 作为小白该如何抉择python编辑器?

    刚开始接触编程,有一个好的编辑器上手,那学习起来肯定是事半功倍的!本篇就给大家介绍适合零基础小白学习Python的四种编辑器,希望大家受用! 1.Sublime Text: 这是一个轻量级的代码编辑器 ...

  2. MySQL 数据库面试题

    原文出处:https://juejin.im/post/5a9ca0d6518825555c1d1acd 作者:Java3y 本文在原文基础上进行修改,而且没有特定针对MySQL. 一.存储过程(以及 ...

  3. MediaAPIController

    using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.D ...

  4. 在realm中动态查询用户的权限&角色

    @Controller @Scope("prototype") @Namespace("/") @ParentPackage("struts-defa ...

  5. shell script 编程入门

    参考 <linux shell scripting cookbook> 控制台输出 结构化输出 #!/bin/bash #Filename: printf.sh printf " ...

  6. vue项目中图片预览旋转功能

    最近项目中需要在图片预览时,可以旋转图片预览,在网上找了下,发现有一款功能强大的图片组件:viewerjs. git-hup: https://github.com/fengyuanchen/view ...

  7. debian设置limits.conf

    最近已经把自己的游戏框架主要功能完成得差不多了,决定将自己的开发环境从debian7升级到debian9,不然太多第三方依赖都跟不上了.debian10刚出来,MongoDB还没适配,所以暂不考虑. ...

  8. 第一章、VUE-挂载点-实例成员-数据-过滤器-文本指令-事件指令-属性指令-表单指令-01

    目录 路飞项目 vue vue 导读 vue 的优势 渐进式框架 引入 vue 实例成员 - 挂载点 el js 对象(字典)补充 实例成员 - 数据 data 实例成员 - 过滤器 filters ...

  9. Linux内核的目录结构

  10. kafka启动失败错误:: replica.fetch.max.bytes should be equal or greater than message.max.bytes

    1 详细异常 2019-10-14 14:38:21,260 FATAL kafka.Kafka$: java.lang.IllegalArgumentException: requirement f ...