Django开发之Admin源码学习

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)),
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值