admin组件
admin是django提供的基于web的管理工具
>如何使用:
1、激活管理工具
通常会在生成项目时在urls.py中自动设置好
from django.urls import path,re_path
#from django.conf.urls import url
from django.contrib import admin urlpatterns =[
path('admin/', admin.site.urls),
# url(r"^admin/", admin.site.urls), 旧版本写法
]
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)
常用的定制功能示例
from django.contrib import admin # Register your models here. from app02.models import * class BookConfig(admin.ModelAdmin):
#定制展示那些列
def show_authors(self,obj):
print(obj.authors.all())
return "/".join([obj.name for obj in obj.authors.all()])
list_display = ('title','price','publishDate','publisher','show_authors')
#定制可以点击跳转的列
list_display_links = ['price']
#定制右侧快速筛选功能
list_filter=['publisher']
#定制搜索查询
search_fields = ['title','price']
#定制可以编辑的列
list_editable = ['title']
#定制htnl模板
# change_list_template = 'mylist.html' #按price排序 降序
ordering = ['-price'] #批量初始化
def path_init(self,request,queryset):
queryset.update(price=111)
path_init.short_description = '批量修改价格为111' #对actiond的描述,可以不写
actions = [path_init,] admin.site.register(Book,BookConfig)
admin.site.register(Author)
admin.site.register(Publish)
admin.py
admin工作过程
1、加载所有app下的admin.py文件
2、在admin中注册模型类
3、基于二级分发设计url路由
admin的url配置
from django.contrib import admin
from django.urls import path,re_path from django.shortcuts import HttpResponse def test01(request):
return HttpResponse('test01....')
def test02(request):
return HttpResponse('test02...')
def test03(request):
return HttpResponse('test03...')
def test04(request):
return HttpResponse('test04...')
def test05(request):
return HttpResponse('test05...') def list_view(request):
return HttpResponse('查询') def add_view(request):
return HttpResponse("添加") def change_view(request,id):
return HttpResponse('修改') def delete_view(request,id):
return HttpResponse('删除') def get_urls2():
temp=[
path('',list_view),
path('add/',add_view),
re_path('(\d+)/change/',change_view),
re_path('(\d+)/delete/',delete_view),
]
return temp def get_urls():
print('----->',admin.site._registry) #{Book:BookConfig,....}
temp = []
for model,config_obj in admin.site._registry.items():
model_name = model._meta.model_name
app_label = model._meta.app_label
temp.append(
path("%s/%s/"%(app_label,model_name),(get_urls2(),None,None)),
)
return temp urlpatterns = [
path('admin/', admin.site.urls), #一级分发
# path('index/',([
# path('test01/',test01),
# path('test02/',test02),
# ],None,None)),
# #二级分发
path('index/',([
path('name/',([
path('alex/',test03),
path('egon/',test04)
],None,None)),
path('shop/',([path('apple/',test05)],None,None)),
],None,None)), #二级分发的应用
path('yuan/',(get_urls(),None,None)), ]
二级分发url
补充知识点:
>实现单例模式的方式
1、使用__new__
2、使用装饰器(decorator)
3、使用元类(metaclass)
4、基于模块实现单例
>通过模型类对象获取类名和应用名(字符串)
Book._meta.model_name ----->'book'
Book._meta.app_label-------->'app01'