我是Python和Django的小伙子,并试图在我学习的过程中学习它,然而,有一件事让我感到困惑。
在我的自定义领域,我有:
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
后才有效。
为什么会这样?
答案 0 :(得分: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
。否则,它是空的dict:
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
,则会被{}
覆盖。