Django의 admin.py 등록 프로세스

6306 단어
일반적으로 Django 프로젝트를 만들 때 Django의 프로필settings.py에 다음과 같은 구성이 있습니다.
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]

이 프로필은 Django가 만든 응용 프로그램을 등록하는 데 사용합니다.
예를 들어 Django 프로젝트를 만들 때 'app01' 이라는 응용 프로그램을 추가했습니다.
만든 항목에는 다음과 같은 "apps.py"라는 파일이 있습니다.
    from django.apps import AppConfig
    
    class App01Config(AppConfig):
        name = 'app01'

등록된 응용 프로그램 이름에 "Config"로 정의된 이 파일의 클래스에는 다음과 같은 방법이 있습니다.
    from django.apps import AppConfig
    
    class App01Config(AppConfig):
        name = 'app01'
        
        def ready(self):
            pass

이것ready .그럼 이 함수는 무슨 소용이 있습니까?admin.py 파일에서 데이터베이스에 있는 데이터 테이블을 등록할 수 있어 Django의 백엔드 관리소에서 등록하는 데이터베이스를 편리하게 할 수 있다.
admin.site.register(models.UserInfo)

모델스.py의 클래스가 여기에 등록되면 백엔드에서 이 데이터 테이블을 관리하는 네 개의 URL을 생성합니다.
/admin/app01/userinfo/
/admin/app01/userinfo/add/
/admin/app01/userinfo/1/change/
/admin/app01/userinfo/2/delete/

실제로 Django 백엔드에서 관리하고 싶은 데이터 테이블을 admin.py 파일에 쓴 후에 Django는 autodiscover_modules 방법을 실행할 것이다.
def autodiscover():
    autodiscover_modules('admin', register_to=site)

Django가 autodiscover_modules를 실행하면 admin.py 파일도 실행됩니다.admin.py 파일만 실행된 후에 Django의 루트에서 Django의 백엔드에서 등록된 데이터 테이블을 삭제하고 수정하는 루트 관계를 생성합니다.
admin이 실행되면 또 site 함수를 실행합니다.site 또 어떤 조작을 할 것인가??site 함수에 들어가서 sites.py 파일의 마지막 줄에서 볼 수 있습니다.
site = AdminSite()

site는 AdminSite이라는 종류의 단일 모델이다.이렇게 하면site를 집행하는 방법은 AdminSite이라는 종류의 __init__방법을 집행하는 것과 같다.
def __init__(self, name='admin'):
    self._registry = {}
    self.name = name
    self._actions = {'delete_selected': actions.delete_selected}
    self._global_actions = self._actions.copy()
    all_sites.add(self)

실행admin.site 방법은 하나의 AdminSite 대상을 실례화한 다음에 이 대상은 AdminSite 이 클래스의 register 방법을 호출한다.
    def register(self, model_or_iterable, admin_class=None, **options):
    
        if not admin_class:
            admin_class = ModelAdmin
    
        if isinstance(model_or_iterable, ModelBase):
            model_or_iterable = [model_or_iterable]
        for model in model_or_iterable:
            if model._meta.abstract:
                raise ImproperlyConfigured(
                    'The model %s is abstract, so it cannot be registered with admin.' % model.__name__
                )
    
            if model in self._registry:
                raise AlreadyRegistered('The model %s is already registered' % model.__name__)
    
            if not model._meta.swapped:
       
                if options:
         
                    options['__module__'] = __name__
                    admin_class = type("%sAdmin" % model.__name__, (admin_class,), options)
    
                self._registry[model] = admin_class(model, self)
register 방법의 앞의 두 매개 변수는 모두 하나의 클래스 이름이다.register 방법의 마지막에 매개 변수에 정의된 클래스를 __init__ 방법_registry에 정의된 빈 사전에 추가하는 것을 볼 수 있다.
동시에 매개 변수 중의 클래스를 실례화한다.
클래스가 실례화된 매개 변수는 이 클래스 자체와site 자체이다.아래의 상황과 유사하게
    {
        models.UserInfo: UserInfoAdmin(models.UserInfo,site  ),
        models.UserGroup: ModelAdmin(models.UserGroup,site  ),
    }

또한 AdminSite를 실례화할 때 단일 모드를 사용했기 때문에 프로그램이 처음 실행된 후에 시스템에 이site 대상이 계속 존재할 것이다.
이렇게 되면 admin.py 프로그램 후 admin.py에 등록된 클래스와 대응하는 프로필을 실례화한 후의 대상을 모두 AdminSiteregister 방법에 봉인한 셈이다.admin.py 실행이 완료된 후에야 Django가 urls.py에 설정된 루트 관계 맵을 실행하기 시작합니다.
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', index),
]

위에서 보듯이 루트 관계 맵에서 Django도 admin.site.urls 방법을 다시 실행할 것이다.
urls 방법에 들어가면 볼 수 있습니다
@property
def urls(self):
    return self.get_urls(), 'admin', self.name

urls 방법은 get_urls 방법을 집행한 것이다.재진입get_urls방법
    def get_urls(self):
        from django.conf.urls import url, include
        
        ...
    
        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
get_urls 방법에서 순환_registry이라는 사전은 사전의 모든 종류에 Django 백엔드에서 사용하는 삭제 및 수정 작업을 생성한다url.
urlpatterns += [
    url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
]
        

여기,
* model._meta.app_label         Django       
* model._meta.model_name      Django        

이 두 문자열을 "/"로 연결하여 새로운 문자열을 생성합니다urlpatterns와 이 문자열을 연결하여 새로운 urlpatterns를 생성했습니다.
이 줄의 뒤에 model_admin는 이 대상의 url 함수를 간접적으로 실행하는 get_url 방법을 사용해서 루트 관계가 비치는 뒷부분을 생성한다.
이 생성된 뒷부분의 루트는 앞의 새로운urlpatterns과 연결되고 순서대로 순환하면 Django 백엔드에서 데이터 테이블 조작을 하는 루트 관계를 생성한다.
위에서 말한 바와 같이 admin.py에 등록models.py된 클래스의 절차
1.    admin.py,          admin.site   
2.  admin.site   , admin.py         ,              admin.site   _registry      
3.    url ,url   site   ,          url

이것이 바로 admin.py에 데이터 표를 등록한 후 Django의 실행 절차입니다.

좋은 웹페이지 즐겨찾기