admin 源码:
1.注册 admin.py
admin.site.register(Book, BookConfig)
源码:
class AdminSite():
def __init__(self, name='admin'):
self._registry = {}
def register(self, model, admin_class):
if not admin_class:
admin_class = ModelAdmin
self._registry[model] = admin_class(model, self)
site = AdminSite()
2.设计url
如何通过model类变量获取该模型的字符串名称和该模型所在app的字符串名称:
print(">", model._meta.model_name)
print(">", model._meta.app_label)
def add(request):
return HttpResponse('ok')
def delete(request, id):
print(id)
return HttpResponse('ok')
def change(request, id):
return HttpResponse('ok')
def list_view(request):
return HttpResponse('ok')
def get_urls2():
temp = []
temp.append(path('add/', views.add))
temp.append(re_path(r'(\d+)/delete/', views.delete))
temp.append(re_path(r'(\d+)/change/', views.change))
temp.append(path('', views.list_view))
return temp
def get_urls():
temp = []
for model, admin_class_obj in admin.site._registry.items():
# print('model', model)
# class 'django.contrib.auth.models.Group'>
# class 'django.contrib.auth.models.User'>
# print("==>", model._meta.model_name)
# print("==>", model._meta.app_label)
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
def get_urls2():
temp = []
temp.append(path('add/', views.add))
temp.append(re_path(r'(\d+)/delete/', views.delete))
temp.append(re_path(r'(\d+)/change/', views.change))
temp.append(path('', views.list_view))
return temp
urlpatterns = [
path('king_admin/', (get_urls(), None, None)) ,
]
在ModelStark中:
self.model: 用户当前访问的模型表
主要实现以下几个功能,最难的就是查看页面(其中涉及到分页和filter)
查看页面:
表头
表数据
search
action
分页
filter
增删改(modelForm)
title = Book._meta.get_field('title') # 拿表中对应字段的对象
title.max_length
将{"page":"12", "title_startwith":"py", "id__gt":"5"} 变为
"page=12&title_startwith=py&id__gt=5"
只需通过以下命令即可:
self.params.urlencode()
admin执行流程
<1> 循环加载执行所有已经注册的app中的admin.py文件
def autodiscover():
autodiscover_modules('admin', register_to=site)
<2> 执行代码
#admin.pyclass BookAdmin(admin.ModelAdmin):
list_display = ("title",'publishDate', 'price')
admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
<3> admin.site
这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每一个app中的每一个admin.site都是一个对象
<4> 执行register方法
admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
class ModelAdmin(BaseModelAdmin):pass
def register(self, model_or_iterable, admin_class=None, **options):
if not admin_class:
admin_class = ModelAdmin
# Instantiate the admin class to save in the registry
self._registry[model] = admin_class(model, self)
思考:在每一个app的admin .py中加上
print(admin.site._registry) # 执行结果?
到这里,注册结束!
<5> admin的URL配置
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
class AdminSite(object):
def get_urls(self):
from django.conf.urls import url, include
urlpatterns = []
# Add in each model's views, and create a list of valid URLS for the
# app_index
valid_app_labels = []
for model, model_admin in self._registry.items():
urlpatterns += [
url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
]
if model._meta.app_label not in valid_app_labels:
valid_app_labels.append(model._meta.app_label)
return urlpatterns
@property
def urls(self):
return self.get_urls(), 'admin', self.name
<6> url()方法的扩展应用
from django.shortcuts import HttpResponse
def test01(request):
return HttpResponse("test01")
def test02(request):
return HttpResponse("test02")
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^yuan/', ([
url(r'^test01/', test01),
url(r'^test02/', test02),
],None,None)),
]
扩展优化
from django.conf.urls import url,include
from django.contrib import admin
from django.shortcuts import HttpResponse
def change_list_view(request):
return HttpResponse("change_list_view")
def add_view(request):
return HttpResponse("add_view")
def delete_view(request):
return HttpResponse("delete_view")
def change_view(request):
return HttpResponse("change_view")
def get_urls():
temp=[
url(r"^$".format(app_name,model_name),change_list_view),
url(r"^add/$".format(app_name,model_name),add_view),
url(r"^\d+/del/$".format(app_name,model_name),delete_view),
url(r"^\d+/change/$".format(app_name,model_name),change_view),
]
return temp
url_list=[]
for model_class,obj in admin.site._registry.items():
model_name=model_class._meta.model_name
app_name=model_class._meta.app_label
# temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
url_list.append(temp)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^yuan/', (url_list,None,None)),
]