2016-01-17 3 views
0

Я новичок в Python и Django и пытаюсь изучить его, поскольку я иду, однако, есть одна вещь, которая меня смущает.Зачем объявлять виджет поля перед супер-init?

В пользовательском поле шахты у меня есть:

def __init__(self, *args, **kwargs): 
    self.request = None 
    self.widget = ReCaptcha 
    super(ReCaptchaField, self).__init__(*args, **kwargs) 
    self.required = True 
    self.error_messages = {'required': self.default_error_messages['captcha_invalid']} 

, и я не могу понять, почему объявить виджет поле работает там, где это, но не после того, как:

super(ReCaptchaField, self).__init__(*args, **kwargs) 

Вместо этого он на самом деле производит ошибка, в которой:

def value_from_datadict(self, data, files, name): 

В мой виджет на самом деле не принят self по какой-то причине.

Однако:

self.error_messages = {'required': self.default_error_messages['captcha_invalid']} 

работает только после вызова super.

Почему это?

ответ

1

В настоящее время я не могу подтвердить это, но я бы предложил возможный способ объяснить это.

Здесь яснее проверить source code. self.widget ожидает класс и виджет позже будет инициализирован как экземпляр класса в __init__ в родительском классе:

widget = widget or self.widget 
if isinstance(widget, type): 
    widget = widget() # the instance initialization 

Если выполнить задание после super, ваш виджет остается класс и никогда не будет инициализирован, при этом не собирается работать.

С другой стороны, error_messages фактически является необязательным параметром для метода __init__. Если вы сообщите, что в функции __init__, он доставит его до self.error_messages. В противном случае это пустая ДИКТ:

messages = {} 
for c in reversed(self.__class__.__mro__): 
    messages.update(getattr(c, 'default_error_messages', {})) 
# see here. Did you provide any error_messages? If no then {} 
messages.update(error_messages or {}) 
# self.error_messages might be {} because the above code 
self.error_messages = messages 

Так что, если вы self.error_messsages до super, он будет перезаписан с {}.

Смежные вопросы