admin模块:

admin提供了5种接口

list_display,

指定数据展示字段,不能放多对多字段
Django的admin源码浅析和模仿Django的admin源码浅析和模仿

list_display_link,哪个字段可以链接

Django的admin源码浅析和模仿

 

search_fields,搜索框

search_fiekds
    search_fields=['title','price']
搜索title里面包含1的,或者price包含1的数据
1.在页面上渲染出搜索框
2.支持条件与条件之间的''或''查询

list_filter:用于筛选

1.它不是用来筛选普通字段的,它是用来帮你筛选外键字段的
2.支持组合查询

acition:批处理

先定义一个批量处理函数
Django的admin源码浅析和模仿Django的admin源码浅析和模仿
页面图:
Django的admin源码浅析和模仿

1.首先Django启动会自动加载配置文件

Django的admin源码浅析和模仿

 

通过autodiscover_modules('文件名')会自动执行每一个应用下的文件

那么创建一个名为stark的应用(模拟admin的应用)和一个名为app01,app02的应用(正常测试应用)

在app01和app02下创建stark.py文件

在setting中为app01,app02,stark注册

点进StarkConfig

Django的admin源码浅析和模仿

模仿admin,在StarkConfig中加入autodiscover_modules

Django的admin源码浅析和模仿

测试一下,在app01,app02下的stark.py文件中,打印字符串

Django的admin源码浅析和模仿

 

Django的admin源码浅析和模仿

 启动Django,运行效果:

Django的admin源码浅析和模仿

这样我们就实现了启动Django的时候就运行我们自己定义的文件了

第一次打印是debug模式,不用管

 2.路由分发

看看admin是怎么做的路由分发

Django的admin源码浅析和模仿

点击site,如下图所示,site是一个类的实例化对象,同样这也是基于模板的单例

Django的admin源码浅析和模仿

那么site.urls是什么?

Django的admin源码浅析和模仿

 

 没错,urls就是AdminSite这个类中有property装饰的一个类而已,@property简单的来说就是外界可以通过点(.)的方式来获取这个函数的返回值,可以当做类的变量来处理

那么看看urls返回了什么

它返回了一个元组

这也是路由分发的根本原理

先说一下路由分发的本质:

路由分发的基本格式:url('正则表达式',([分发的路由],None,None))

一级分发:此时生成了两条路由

Django的admin源码浅析和模仿

二级分发:此时生成了四条路由

Django的admin源码浅析和模仿

 

 通过这样的原理,可以无限的分发,三级分发,四级分发等等

现在在看这句源码:

Django的admin源码浅析和模仿

和基础格式([ ],None,None)是不是对应了起来,那么我们猜测self.get_urls()返回的是一个列表

检验一下:

 def get_urls(self):
        from django.conf.urls import url, include
        # Since this module gets imported in the application's root package,
        # it cannot import models from other applications at the module level,
        # and django.contrib.contenttypes.views imports ContentType.
        from django.contrib.contenttypes import views as contenttype_views

        def wrap(view, cacheable=False):
            def wrapper(*args, **kwargs):
                return self.admin_view(view, cacheable)(*args, **kwargs)
            wrapper.admin_site = self
            return update_wrapper(wrapper, view)

        # Admin-site-wide views.
        urlpatterns = [
            url(r'^$', wrap(self.index), name='index'),
            url(r'^login/$', self.login, name='login'),
            url(r'^logout/$', wrap(self.logout), name='logout'),
            url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
            url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True),
                name='password_change_done'),
            url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
            url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut),
                name='view_on_site'),
        ]

        # 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)

        # If there were ModelAdmins registered, we should have a list of app
        # labels for which we need to allow access to the app_index view,
        if valid_app_labels:
            regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
            urlpatterns += [
                url(regex, wrap(self.app_index), name='app_list'),
            ]
        return urlpatterns
源码

相关文章:

  • 2022-12-23
  • 2021-12-19
  • 2022-01-21
  • 2022-01-05
  • 2021-07-18
  • 2022-12-23
  • 2021-08-21
  • 2021-12-26
猜你喜欢
  • 2022-03-02
  • 2021-09-27
  • 2021-07-01
  • 2022-12-23
  • 2022-12-23
  • 2021-11-27
  • 2022-12-23
相关资源
相似解决方案