django之admin管理工具
admin组件
admin是django提供的基于web的管理工具
>如何使用:
1、激活管理工具
通常会在生成项目时在urls.py中自动设置好
1 from django.urls import path,re_path 2 #from django.conf.urls import url 3 from django.contrib import admin 4 5 urlpatterns =[ 6 path('admin/', admin.site.urls), 7 # url(r"^admin/", admin.site.urls), 旧版本写法 8 ]
2、创建用户
通过命令 python manage.py createsuperuser 来创建超级用户
然后在浏览器中访问127.0.0.1:8000/admin/ 就会出现登录界面。
3、注册数据模型到admin
from app01.models import Book #在admin中注册模型中的某个类,即可在admin中实现增删改查 #简单使用 admin.site.register(Book) #获得更多的定制操作,需要利用ModelAdmin进行配置 #定制用法 class BookConfig(admin.ModelAdmin): list_display = ('title', 'price','publish') #定制展示哪些列的内容 admin.site.register(Book,BookConfig)
常用的定制功能示例
1 from django.contrib import admin 2 3 # Register your models here. 4 5 from app02.models import * 6 7 class BookConfig(admin.ModelAdmin): 8 #定制展示那些列 9 def show_authors(self,obj): 10 print(obj.authors.all()) 11 return "/".join([obj.name for obj in obj.authors.all()]) 12 list_display = ('title','price','publishDate','publisher','show_authors') 13 #定制可以点击跳转的列 14 list_display_links = ['price'] 15 #定制右侧快速筛选功能 16 list_filter=['publisher'] 17 #定制搜索查询 18 search_fields = ['title','price'] 19 #定制可以编辑的列 20 list_editable = ['title'] 21 #定制htnl模板 22 # change_list_template = 'mylist.html' 23 24 #按price排序 降序 25 ordering = ['-price'] 26 27 #批量初始化 28 def path_init(self,request,queryset): 29 queryset.update(price=111) 30 path_init.short_description = '批量修改价格为111' #对actiond的描述,可以不写 31 actions = [path_init,] 32 33 34 35 admin.site.register(Book,BookConfig) 36 admin.site.register(Author) 37 admin.site.register(Publish)
admin工作过程
1、加载所有app下的admin.py文件
2、在admin中注册模型类
3、基于二级分发设计url路由
admin的url配置
1 from django.contrib import admin 2 from django.urls import path,re_path 3 4 from django.shortcuts import HttpResponse 5 6 def test01(request): 7 return HttpResponse('test01....') 8 def test02(request): 9 return HttpResponse('test02...') 10 def test03(request): 11 return HttpResponse('test03...') 12 def test04(request): 13 return HttpResponse('test04...') 14 def test05(request): 15 return HttpResponse('test05...') 16 17 def list_view(request): 18 return HttpResponse('查询') 19 20 def add_view(request): 21 return HttpResponse("添加") 22 23 def change_view(request,id): 24 return HttpResponse('修改') 25 26 def delete_view(request,id): 27 return HttpResponse('删除') 28 29 def get_urls2(): 30 temp=[ 31 path('',list_view), 32 path('add/',add_view), 33 re_path('(\d+)/change/',change_view), 34 re_path('(\d+)/delete/',delete_view), 35 ] 36 return temp 37 38 def get_urls(): 39 print('----->',admin.site._registry) #{Book:BookConfig,....} 40 temp = [] 41 for model,config_obj in admin.site._registry.items(): 42 model_name = model._meta.model_name 43 app_label = model._meta.app_label 44 temp.append( 45 path("%s/%s/"%(app_label,model_name),(get_urls2(),None,None)), 46 ) 47 return temp 48 49 50 urlpatterns = [ 51 path('admin/', admin.site.urls), 52 53 #一级分发 54 # path('index/',([ 55 # path('test01/',test01), 56 # path('test02/',test02), 57 # ],None,None)), 58 # 59 60 #二级分发 61 path('index/',([ 62 path('name/',([ 63 path('alex/',test03), 64 path('egon/',test04) 65 ],None,None)), 66 path('shop/',([path('apple/',test05)],None,None)), 67 ],None,None)), 68 69 #二级分发的应用 70 path('yuan/',(get_urls(),None,None)), 71 72 ]
补充知识点:
>实现单例模式的方式
1、使用__new__
2、使用装饰器(decorator)
3、使用元类(metaclass)
4、基于模块实现单例
>通过模型类对象获取类名和应用名(字符串)
Book._meta.model_name ----->'book'
Book._meta.app_label-------->'app01'