自定义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. dedecms发布文章时间显示多少分钟前

    /**文章发布多少时间前*/function tranTime($time) { $rtime = date("m-d H:i",$time); $htime = date(&qu ...

  2. 美团CodeM初赛B轮 合并字符串的价值 (线段树,分类讨论)

    输入两个字符串a和b,合并成一个串c,属于a或b的字符在c中顺序保持不变.如"ACG"和"UT"可以被组合成"AUCTG"或"AC ...

  3. 作业10:String类

    一.基本案例 1.new String("helloworld") 与 "helloworld" public static void main(String[ ...

  4. 完全卸载RabbitMQ和Erlang

    要从计算机中完全卸载RabbitMQ和Erlang,请执行以下操作:(1)打开Windows控制面板,双击“程序和功能”. (2)在当前安装的程序列表中,右键单击RabbitMQ Server,然后单 ...

  5. CF336C-Vasily the Bear and Sequence题解--贪心

    题目链接 https://www.luogu.org/problemnew/show/CF336C 分析 一个比较妙的贪心 我们要让最后\(and\)起来的数被\(2^k\)整除且\(k\)最大,我们 ...

  6. Advanced Installer 开始-程序那里增加,快捷方式、卸载软件、官方网站

    .     这个是效果.

  7. spark streaming消费kafka: Java .lang.IllegalStateException: No current assignment for partition

    1 原因是: 多个相同的Spark Streaming同时消费同一个topic,导致的offset问题.关掉多余的任务,就ok了.

  8. python基础:if判断与流程控制案例

    # 1.使用while循环输出1 2 3 4 5 6 8 9 10 count = 0 while count < 11: if count == 7: count += 1 continue ...

  9. Physical Education Lessons CodeForces - 915E (动态开点线段树)

    Physical Education Lessons CodeForces - 915E This year Alex has finished school, and now he is a fir ...

  10. Codeforces 1175F The Number of Subpermutations

    做法①:RMQ(预处理NLOGN+后续跳跃蜜汁复杂度) 满足题意的区间的条件转换: 1.长度为R-L+1则最大值也为R-L+1 2.区间内的数不重复 当RMQ(L,R)!=R-L+1时 因为已经保证了 ...