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에 따라 라이센스가 부여됩니다.