1. 程式人生 > >Django之admin的使用及源碼分析

Django之admin的使用及源碼分析

ssa conf .site cacheable 默認 通過 ice each reg

一、admin組件使用

  Django本身提供了基於 web 的管理工具。其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到:

INSTALLED_APPS = [
    django.contrib.admin,
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles
, "app01" ]

  - 在使用admin界面管理數據之前,需要先註冊一個超級用戶,可在終端通過python manage.py createsuperuser來創建。

二、源碼分析

  1、在啟動Django時,會自動執行初始化文件裏的autodiscover函數,從而循環加載所有已經註冊的app中的admin.py文件

def autodiscover():
    autodiscover_modules(admin, register_to=site)

  2、執行代碼

# 這裏為自定制的顯示樣式
class BookAdmin(admin.ModelAdmin):
    list_display 
= ("title",publishDate, price) admin.site.register(Book, BookAdmin) # model類名,樣式類名(不寫使用默認樣式) admin.site.register(Publish)

  3、admin.site會實例化一個對象

技術分享圖片

    - 這裏應用的是單例模式,每一個app中的每一個admin.site實例化的對象都是同一個

  4、執行register方法

def register(self, model_or_iterable, admin_class=None, **options):
    # model_or_iterable表示掃描到的每一個已註冊的model對象
# admin_class傳一個類,這個類裏面定義的是admin頁面的顯示樣式 if not admin_class: admin_class = ModelAdmin # ModelAdmin是默認的顯示樣式 if model in self._registry: # 判斷每個model對象是否在_registry字典裏 raise AlreadyRegistered(The model %s is already registered % model.__name__) self._registry[model] = admin_class(model, self) # 以model對象為鍵,指定的樣式類為值存放到_registry裏 # 以上無用部分已忽略

  到此,完成全部註冊操作

  5、admin的URL配置

# 在某一py文件下寫下如下代碼
from django.contrib import admin
from .models import *
urlpatterns = [
    url(r^admin/, admin.site.urls), #調用AdminSite類下的urls方法。
]
class AdminSite(object):
def get_urls(self): from django.conf.urls import url, include from django.contrib.contenttypes import views as contenttype_views
# 這一裝飾器可以在調用視圖函數的時候將request傳給該函數 def wrap(view, cacheable=False): def wrapper(*args, **kwargs): return self.admin_view(view, cacheable)(*args, **kwargs) # admin_view代碼已省略 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), ] # 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 six.iteritems(self._registry): 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 @property def urls(self): return self.get_urls(), admin, self.name

Django之admin的使用及源碼分析