django.forms-Form 및 Field 연결

1667 단어
class DeclarativeFieldsMetaclass(MediaDefiningClass):
    """
    Metaclass that collects Fields declared on the base classes.
    """
    def __new__(mcs, name, bases, attrs):
        # Collect fields from current class.
        current_fields = []
        for key, value in list(attrs.items()):
            if isinstance(value, Field):
                current_fields.append((key, value))
                attrs.pop(key)
        current_fields.sort(key=lambda x: x[1].creation_counter)
        attrs['declared_fields'] = OrderedDict(current_fields)

        new_class = (super(DeclarativeFieldsMetaclass, mcs)
            .__new__(mcs, name, bases, attrs))

        # Walk through the MRO.
        declared_fields = OrderedDict()
        for base in reversed(new_class.__mro__):
            # Collect fields from base class.
            if hasattr(base, 'declared_fields'):
                declared_fields.update(base.declared_fields)

            # Field shadowing.
            for attr, value in base.__dict__.items():
                if value is None and attr in declared_fields:
                    declared_fields.pop(attr)

        new_class.base_fields = declared_fields
        new_class.declared_fields = declared_fields

        return new_class

Declarative Fields Metaclass는 Media Defining Class를 계승합니다.Media Defining Class 는 미디어 정보 를 수집하는 것 입니다. 제 글 에는
django.forms-Widget과 미디어 간의 연락처가 소개되어 있습니다.
이제 구체적으로 Declarative Fields Metaclass가 어떻게 Field를 수집하는지 살펴보자.
이것은 우선 attrs를 옮겨다니며 현재 클래스 성명의 Field를 수집합니다.
그리고 기본 클래스의 declaredfields.기본 클래스의 섀도우 필드를 제거합니다(필드를 None으로 설정함).

좋은 웹페이지 즐겨찾기