Некоторые соответствующие определения встречаются в django/forms/forms.py
. Это:
class BaseForm
class Form
class DeclarativeFieldsMetaclass
def get_declared_fields
get_declared_fields
вызывается из DeclarativeFieldsMetaclass
и создает список с экземплярами полей, отсортированными по их счетчику создания. Затем он добавляет поля из базовых классов в этот список и возвращает результат в виде OrderedDict
экземпляра с именем поля, которое служит ключом. DeclarativeFieldsMetaclass
затем вставляет это значение в атрибут base_fields
и вызывает type
для создания класса. Затем он передает класс в функцию media_property
в widgets.py
и присоединяет возвращаемое значение к атрибуту media
в новом классе.
media_property
возвращает метод свойства, который восстанавливает объявления мультимедиа при каждом доступе. У меня такое ощущение, что здесь это не будет актуально, но я могу ошибаться.
В любом случае, если вы не объявляете атрибут Media
(а ни один из базовых классов не делает), то он возвращает только свежий экземпляр Media
без аргументов конструктору, и я думаю, что monkeypatching новое поле должно быть так же просто, как ручная вставка поля в base_fields
.
ContactForm.another_field = forms.CharField(...)
ContactForm.base_fields['another_field'] = ContactForm.another_field
Каждый экземпляр формы получает deepcopy
из base_fields
, который становится form_instance.fields
в методе __init__
из BaseForm
. НТН.