Django / Python Программный поток и структура - PullRequest
0 голосов
/ 19 марта 2020

Я новый разработчик и изучаю Python и Django. Я пытаюсь понять структуру и поток за кулисами, и меня смущает строка кода, с которой я столкнулся. Ну, на самом деле меня смущает ряд вещей, но это один конкретный пример. Может ли кто-нибудь помочь мне понять последовательность следующего кода:

from django.contrib import admin
from .models import Post

admin.site.register(Post)

При поиске файлов библиотеки в моей виртуальной среде я нахожу папку с именем django, и внутри этой папки я нахожу contrib и внутри этой папки. Я нахожу админа. Я вижу, что файл init .py в пакете администратора содержит операторы импорта, которые импортируют в *, что, как я понимаю, является всем в различных доступных модулях. Когда я go копаюсь в различных модулях, я нахожу sites.py и внутри sites.py я нахожу переменную "site", которая является объектом, для которого был создан экземпляр. Вот фрагмент кода из модуля sites.py:

site = DefaultAdminSite()

Хорошо, вот где я запутался. Оглядываясь назад на исходный код, где извлекается функция «register». Я обращаюсь к переменной, которая содержит экземпляр объекта из класса DefaultAdminSite (). Этот класс также определен в sites.py и является дочерним классом LazyObject. LazyObject определен в модуле, расположенном по адресу django .utils.functional. Там тоже нет метода или атрибута регистра.

Итак, вкратце, вот что я думаю, код делает. Он обращается к экземпляру объекта "site", который находится по адресу django .contrib.admin.sites.site. Но затем этот объект сайта обращается к «зарегистрировать что-то или другое» и передает созданную мной модель Post. Я просто не могу найти "зарегистрироваться" нигде. Может кто-нибудь пролить свет на это?

1 Ответ

0 голосов
/ 19 марта 2020

Это действительно немного запутанно - но это часто имеет место для сложных структур. Если вы читаете код DefaultAdminSite, вы видите это:

def _setup(self):
     AdminSiteClass = import_string(apps.get_app_config('admin').default_site)
     self._wrapped = AdminSiteClass()

Это загружает объект AppConfig для приложения admin, который (если не переопределен) находится в admin/apps.py и определяет default_site как 'django.contrib.admin.sites.AdminSite'. Затем он передается в import_string(), который импортирует модуль 'django .contrib.admin.sites' и возвращает класс AdminSite. LazyObject является (своего рода) прокси , поэтому технически вы хотите найти метод register в классе ÀdminSite.

...