Django의 admin.py 등록 프로세스
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
에 등록된 클래스와 대응하는 프로필을 실례화한 후의 대상을 모두 AdminSite
의register
방법에 봉인한 셈이다.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의 실행 절차입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.