2013-10-30 36 views
1

Django上我得到这个回溯:Django的:关键字参数多个值 '初始'

File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper 
    372.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func 
    89.   response = view_func(request, *args, **kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner 
    202.    return view(request, *args, **kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper 
    25.    return bound_func(*args, **kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func 
    21.     return func(self, *args2, **kwargs2) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/db/transaction.py" in inner 
    223.     return func(*args, **kwargs) 
File "/Users/eeytan/ddragon/lib/python2.7/site-packages/django/contrib/admin/options.py" in change_view 
    1085.    form = ModelForm(request.POST, request.FILES, instance=obj) 

Exception Type: TypeError at /admin/dragon_portal/parentprofile/1/ 
Exception Value: __init__() got multiple values for keyword argument 'instance' 

对于基于Creating one Django Form to save two models此代码:

class ParentCreationForm(UserCreationForm): 
    first_name = forms.CharField(max_length=100) 
    last_name = forms.CharField(max_length=100) 
    email  = forms.EmailField() 
    #ice_contact = forms.CharField(max_length=100) 
    #notes  = HTMLField() 

    def __init__(self, instance=None, *args, **kwargs): 
     _fields = ('username', 'first_name', 'last_name', 'email', 'password') 
     _initial = model_to_dict(instance.dragonuser, _fields) \ 
      if instance is not None else {} 
     kwargs['initial'] = _initial 
     super(ParentCreationForm, self).__init__(instance=instance, *args, **kwargs) 
     self.fields.update(fields_for_model(DragonUser, _fields)) 

正如你所看到的,签名__init__()没有改变。另外,更奇怪的是,Django的更详细的回溯表明,对于回溯中的每一步,argv总是,总是,{},所以我甚至不知道错误来自哪个回溯点。

+0

* args和'** kwargs'的值是什么?似乎在'** kwargs'中有一个关键值对'instance' –

+0

你能展示调用这段代码的视图吗? – karthikr

+0

另外,是否存在'instance'或'initial'的问题? – karthikr

回答

1

对于ModelForm,__init__函数签名不正确。

Django source for BaseModelForm可以看出,函数签名是:

def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, 
       initial=None, error_class=ErrorList, label_suffix=None, 
       empty_permitted=False, instance=None): 

所以,如果有人实例的形式在第一位置的未命名参数作为Django的话,那么你就用这个错误结束。

我建议你重写__init__这样的:

def __init__(self, *args, **kwargs): 
     instance = kwargs.get('instance') 
     _fields = ('username', 'first_name', 'last_name', 'email', 'password') 
     _initial = model_to_dict(instance.dragonuser, _fields) \ 
      if instance is not None else {} 
     kwargs['initial'] = _initial 
     super(ParentCreationForm, self).__init__(*args, **kwargs) 
     self.fields.update(fields_for_model(DragonUser, _fields)) 
+0

伙计,在彼此的7秒内。金克斯! –

+0

会发生一些!你的回答实际上是一样的,你会得到我的投票。 –

+0

因此你得到我的! –

1

的问题是,Python将不会让您符合规范在调用你的初始化“实例”关键字参数(如正在做在.../django/contrib/admin/options.py:1085中),因为调用中的第一个参数由于参数的顺序而被映射到“实例”,然后第三个参数也被映射到“实例”因为被指定为关键字参数。

要解决这个问题,从您的__init__签名删除instance=None和替代方法的第一行做到这一点:

instance = kwargs.get("instance") 

而且从超级调用删除instance=instance为实例,应在kwargs现在进行。

相关问题