背景
我试图合并(通过mixins)2个第三方应用程序表单类,但是收到此错误
__init__() got multiple values for keyword argument 'user'
这是我的表单类的MRO
<class 'account.forms.EmailAddForm'>,
<class 'djangular.forms.angular_model.NgModelFormMixin'>,
<class 'djangular.forms.angular_validation.NgFormValidationMixin'>,
<class 'djangular.forms.angular_base.NgFormBaseMixin'>,
<class 'allauth.account.forms.AddEmailForm'>,
<class 'allauth.account.forms.UserForm'>,
<class 'django.forms.forms.Form'>,
<class 'django.forms.forms.NewBase'>,
<class 'django.forms.forms.BaseForm'>,
<type 'object'>
这些是每个班级的__init__
方法
class NgModelFormMixin(NgFormBaseMixin):
def __init__(self, data=None, *args, **kwargs):
...
class NgFormValidationMixin(NgFormBaseMixin):
def __init__(self, *args, **kwargs):
...
class NgFormBaseMixin(object):
def __init__(self, data=None, *args, **kwargs):
...
class NgFormBaseMixin(object):
def __init__(self, data=None, *args, **kwargs):
...
class AddEmailForm(UserForm):
...
class UserForm(forms.Form):
def __init__(self, user=None, *args, **kwargs):
self.user = user
super(UserForm, self).__init__(*args, **kwargs)
class BaseForm(object)
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
empty_permitted=False):
...
问题
有没有办法解决这个问题,而无需使用猴子修补UserForm.__init__
方法?
修改
抱歉,我应该提到我了解导致错误的原因 - 在user=None
方法签名中明确使用UserForm.__init__
。这是第三方应用程序中包含的逻辑。
答案 0 :(得分:0)
您似乎在 UserForm .__ init __ 方法中的 * args 或 ** kwargs 参数中传递了用户参数implecilty。
答案 1 :(得分:0)
问题是函数定义会扰乱位置参数的顺序。在所有子类和父类中,data
是第一个位置参数。在UserForm
中,data
仍然是第一个位置参数,但它由user
参数捕获。如果user
也包含在关键字参数中,则会出现该错误。
对此的一个简单解决方案是仅使用关键字参数。然后,没有位置参数可以改变可以与关键字参数冲突的位置。
如果这超出了您的控制范围,您可以覆盖__init__
方法并将所有位置参数映射到其对应的关键字参数。